* 추가할 기능 구현 (게시판)

- 조회수 조작 방지 기능



* 추가할 기능 구현 (인증)

- 소셜 인증


--------------------------------------------------------------------------------------


  조회수 조작 방지에 관해 어떻게 해결해야할까 고민하던 중 오늘 자료실의 좋아요 기능을 만들면서 해결책이 가늠이 잡혔다. 하지만 이번 일지에서는 구현하지 못하였다.


  이번 일지에서는 자료실을 추가하였다. 게시판과 똑같다. 다만 파일 업로드, 다운로드 기능이 새로웠고, 조회수 대산 좋아요 기능을 추가하였다.




  자료실 모델이다.


< model >


  게시판과 똑같다. 다른 점은 FileField 가 추가되었다.


< urls.py >


  게시판과 같고 다른점은 좋아요 기능 구현을 위한 url이 추가되었다.


자료실의 모습이다.


< 자료실 모습 >


  게시판과 같은 모습이지만 맨 오른쪽에 좋아요 수를 보여주고 있다.


자료실 업로드는 큰 어려움이 없었는데 업로드된 파일을 다른 사용자가 다운로드해주는 기능을 추가해야했다.


< 다운로드 기능 >


  DEBUG 모드에서는 단순히 URL 주소를 넘겨주면 직접 접근이 가능하다. 하지만 실제 배포하였을 때는 직접 접근이 안되기 때문에, 다운로드 기능을 추가해주어야한다. file_url 에서 맨 앞 글자를 지운 이유는 이상하게도 업로드된 사진을 웹에 보여주는 것과는 동작이 달랐기 때문인데 문제를 분석하다보니 url 다루는 차이가 있었다.


  file의 경우 앞에 / 문자가 없어야 잘 동작했고 사진의 경우 / 문자가 있어야 잘 동작했다. 그래서 / 문자를 settings.py 에서는 넣어서 설정을 하고 파일 다운로드 기능에서는 위와 같이 [1:] 을 사용해 맨 처음 문자를 빼고 넣어주었다.



< 다운로드 >


  다운로드를 클릭하니 다운로드 되었다.



< 다운로드 된 모습 >



  다음으로 좋아요 기능이다.


< like_tools 추가 >


  먼저 사용자의 프로필에 like_tools를 추가해주었다. 이는 ManyToMany 필드로 연결했다.



< 토글 기능 >


  토글기능은 현재 사용자의 좋아요 리스트에서 해당 포스트 자료가 존재하면 remove 해주고 존재하지 않으면 add로 해당 포스트 자료를 추가해준다.



< html >


  마찬가지로 좋아요 리스트에 있다면 좋아요를 누른것이므로 Unlike를 출력해주고 없으면 아직 누르지 않은 것으로 Like 를 출력하여 토글 버튼이 되도록 하였다.



< 좋아요 클릭 >



< 좋아요 클릭한 모습 >


  좋아요를 클릭하면 Unlike로 바뀐다.



< 좋아요 수 출력 >


  좋아요 수는 해당 자료를 좋아요 누른 사람들의 수를 count 하여 출력해준다.


* 서버 호스팅

- MySQL 연동

- AWS 구축 및 환경 구축

- 호스팅 및 DNS 등록


* 추가할 기능 구현 (게시판)

- 조회수 조작 방지 기능



* 추가할 기능 구현 (인증)

- 소셜 인증


* 추가할 기능 구현 (게시판)

- 댓글 기능

- 조회수 기능

- 게시글 삭제 기능


* 추가할 기능 구현 (인증)

- 소셜 인증


------------------------------------


  오늘은 댓글 기능과 조회수 기능을 추가하였다.


  추가적으로 게시판의 모양을 테이블로 조금 더 그럴싸하게 만들었다.


< 게시판 표 작성 >


  게시판 모델 HTML을 가져와 사용했고, 컨텐츠는 전달받는 post에서 뽑아서 뿌려주었다.



< 게시판 모양 >


  다음으로 댓글 기능을 추가하였다.


다음은 댓글 Model이다.


< Comment Model >


  writer를 Profile과 연결해주었다. 또 post와도 연결해주었다.


  다음은 템플릿에서 댓글 출력 코드이다. 


< 댓글 출력 코드 >


  Comment 모델에서 post를 외부키로 연결할 때 related_name을 comments로 정의해주어서 comments로 접근할 수 있다.


  여기에 사진은 캡쳐하지 않았지만 comment.comment_writer로 닉네임을 출력할 수 있었던 이유는 내가 Profile 모델을 정의하면서 __str__ 을 overwrite해서 닉네임을 출력하게 만들었기 때문이다.


< 댓글 출력 화면 >



  다음으로 댓글 쓰기 기능을 만들었다. 쓰기의 경우 기존 detail 보는 템플릿에서 폼을 추가해주고 해당 폼을 처리해줄 view를 만드는 과정으로 진행했다.



< form 생성 >


  post 와도 외부키가 연결되어있기 때문에 post의 pk가 필요하다.



< comment_write view >


  POST 메서드일 경우만 처리하게 만들었다. 이 경우 post를 pk로 뽑아내고 현재 로그인한 사용자의 user를 가져와 연결된 Profile을 작성자와 연결해준다. 그 후 각 내용을 Comment 로 생성해주면 된다.



< 테스트 댓글 작성 >



< 댓글 작성 확인 >


  다음으로 댓글의 개수를 출력해주었다.


< 댓글 수 >


  이 댓글 수를 새주는 것은 all 대신 count를 이용하면 되었다.



  다음으로! 조회수 기능이다.! 

나는 Detail View(CBV)를 사용하였는데, 인터넷에 보니 CBV를 사용할 경우 처리해야할 게 많아서 보통 다른 lib를 이용한다고 들었다. 그런데 내가 일단 구현해 보았다.



< 조회수 증가 함수 생성 >


  @property를 이용하면 템플릿에서도 사용할 수 있다. 조회수를 1 늘리고 저장한다.



< 템플릿에 삽입 >


  이렇게 되면 해당 화면이 불려질때마다 해당 post의 조회수가 1씩 증가한다.



< 조회수 증가 테스트 >

  


  테스트해보니 문제가있었다...

해당 템플릿이 로드 될 때마다 조회수가 증가하다보니, F5를 연달아 누르면 조회수가 막 올라간다... 


  이 기능을 세션을 가지고 처리했던 것 같은데 자세히 다시 알아보고 처리해야겠다.



* 추가할 기능 구현 (게시판)

- 댓글 수정기능

- 조회수 조작 방지 기능

- 게시글 삭제 기능


* 추가할 기능 구현 (인증)

- 소셜 인증



  Django 프로젝트에서 게시판 프로젝트를 시작한다. 인증 부분에서 소셜인증, 회원정보 수정을 제외하고는 전부 구현하였다. (나머지 기능은 차차 구현할 것이다.)



  오늘은 게시판에서 게시글들을 출력하고 게시글을 들어가서 확인하는 것까지 구현하였다.


  먼저 시간 설정을 해주었다. Post 모델을 정의하여 게시글을 만들었다. 이 때 작성일시를 자동으로 현재 날짜시간을 기록하게 하였는데, 이 때 settings.py 에서 설정해주어야할 것이 있다.


< settings.py 설정 >


  이 변수를 False로 설정해야 settings.py에서 설정한 시간대를 프로젝트 전체에서 사용할 수 있다.



  Post 모델을 정의하였다.


< Post 모델 >


  이 모델은 게시글이다. 작성자를 CharField로 설정한 이유는 사용자의 프로필에서 nickname을 가져와서 문자열로 저장하려고 하기 위해서이다.



< urls.py >


  다음으로 urls.py를 설정해준다. 기본적인 게시글 리스트와 디테일을 만들었다. 그리고 추가적으로 글 쓰기와, 글 수정을 만들었다.



< CBV를 이용한 View >


  글 리스트와 디테일은 CBV를 이용하여 쉽게 구현하였다.



< 게시글 목록 보기 >



< 게시글 자세히 보기 >


  다음으로 글 작성하는 것을 만들었다. CreateView (CBV)를 이용할 수 있었지만, 나는 작성자에 사용자의 프로필에 있는 닉네임을 넣어줄 것이고 또한 메세지를 출력해주고 싶었기에 직접 view를 만들었다.


< post_write view >


  글쓰기 뷰를 만들고 테스트해보았다.



< 글 작성 테스트 >



< 글 작성 성공 메세지 알람 >


< 글 작성 리스트에서 확인 >



< 글 작성 내용 보기로 확인 >



  다음으로 작성한 글에 대한 내용을 수정하는 것이다.


< post_update view >


  여기서 인증부분이 필요했다. 글은 아무나 수정하면 안되기 때문이다. 로그인한 사용자의 정보에서 프로필을 가져와 프로필에 있는 닉네임과 게시글 작성자를 비교하여 같으면 수정을 허락하고 같지 않으면 경고를 해준다.



< 글 수정 테스트 >



< 글 수정 성공 메세지 알람 >


< 글 수정 확인 >


  오늘 일지의 마지막으로는 유저 확인기능에 대해서 정리할 것이다. 게시글에서 작성자가 나오는데 해당 작성자에 대해 알아볼 수 있는 기능을 추가하기로 했다. 작성자를 클릭하면 작성자의 정보가 나오게 하는 것이다.



< user_select_info view >


  개인 정보 확인하는 것을 그대로 따왔다.



< urls 추가 >


  개인정보의 경우 로그인정보를 이용하여 정보를 가져오면 되지만 다른 사용자의 정보를 출력하기 위해서는 해당 사용자의 정보를 넘겨줘야한다. 그래서 나는 작성자를 넘겨 주기로 했다.



< 작성자 확인 테스트 >

  tfa 를 클릭해보았다.



< 다른 사용자 정보 확인 >


  다른 사용자의 정보를 확인 할 수 있었다.



=============================


* 추가할 기능 구현 (게시판)

- 댓글 기능

- 조회수 기능

- 게시글 삭제 기능


* 추가할 기능 구현 (인증)

- 소셜 인증



오늘은 CoffeeNet 프로젝트를 Github에 올렸다.

나는 블로그 처럼 뚝 하고 올리는 건줄 알았는데, 아니었다.
Git  이라는 Source Code Management 개념이있었다.

프로그램을 만들 때 버전 관리를 위해서, 그리고 다른 사람들과 같이 작업하기 위해
git을 사용한다고 한다.
local git에 저장하고 있다가, remote git에 저장하고 가져오고 한다.
오픈소스라 원격에 저장한 것은 다른 사람들도 쉽게 가져가서 수정하고 할 수 있다.

그 remote git 저장소 중 하나가 github이다. 제일 잘 나가는 저장소 중 하나이다.

github에서 계정을 만들고 새 저장소를 만든다.



(저장소 생성)



생성된 저장소는 아래와 같다.




(생성된 저장소)


이제 remote 저장소와 현재 저장소를 연결해야한다.



(사용자 정보 입력)


사용자 정보를 입력한다.

그리고 remote 저장소와 연결



(remote 저장소와 연결)


이와 같이 하면 연결은 끝난다.

이제 현재 내 VM-kali 호스트와 계정을 연결해 둘 것이다.



(SSH 연결)


ssh 공개키를 내 계정에 저장해 두었다.

기존에 있는 프로젝트와 연결하고 push 하려했더니 자꾸 싱크가 안맞아서 에러가 났다...

그래서 할 수 없이 새로 다른 폴더를 만들고, 거기서 git clone을 해준 뒤, 작업했다.


(add 전)


git clone 한 폴더에 내가 작업했던 파일들을 다 복사했다.

그리고 git status를 치니 아직 추적되지 않은 파일들이 나온다.


(add)


해당 폴더의 모든 파일을 add 해준다.
이렇게 되면 index에 다 들어가게 되고

commit을 해준다.


(commit)


이제 로컬 저장소에 변경 사항들이 저장되었다.

이제 이 정보들을 remote 저장소에 push 해주면 된다.


(push)


이렇게 다 하면 내 CoffeeNet 저장소에 아래와 같이 내가 그 동안

작업했던 내용들이 업로드 된다.



(원격 저장소)


이제 CoffeeNet 프로젝트를 소개할 README.md 를 작성해야한다.



(README.md)


위와 같이 간단히 작성하였다.

방금 작성한 README파일을 내 로컬에도 옮겼다.



(pull)


pull, push를 이용하여 github에 소스코드를 올리고 내려받으면서 관리할 수 있다.

추가적으로 이제 github를 통해 다른 사람들이 나의 코드를 받아갈 수 있다.
그런데 바로 실행이 안될 가능성이 크다.
python3 가 없을 수도있고, 내가 사용한 모듈이 없을 수도 있기 때문이다.

그렇기에 이와 관련되어 필요한 파일들을 설치해주는 setup.sh 쉘스크립트를 작성했다.



(setup.sh)


setup.sh 은
처음 작성해보는 쉘스크립트였는데,
Veil-Framework의 setup.sh를 참고하여 공부하면서 작성하였다.

그리고 파이썬의 필요한 모듈들을 파일로 이름들을 저장해두었다.


(필요한 모듈)


이 파일을 읽어서
하나씩 있는지 검사하고 없으면 설치해주는 쉘스크립트이다.

이로써, github에 업로드 까지 끝났다!!

CoffeeNet 프로젝트의 한 축이 끝났다.
이제 이 버전에 새로운 Tool을 추가하면서, 기존에 있던 코드들을 보수하고 수정하면서 관리할 계획이다.


지난 프로젝트에서의 계획
1. custom 메뉴 기능 구현 (커스텀 옵션 설정기능)
2. Framework의 update 기능 구현
3. 그 외 마무리 작업.

오늘 대망의 이 스캐너 작업이 끝났다.!!!
마지막으로 생각하던 custom 으로 옵션을 설정하는 기능을 추가하였고,
그 외에 마지막으로 스캐너의 기타 기능들을 정리하고 마무리하였다.

custom 옵션같은 경우, 스캐너 클래스에 custom_option이라는 문자열 변수를 놓고 여기에 옵션을 사용자로부터 입력받아 저장하고, 스캔할 때 이 옵션을 뒤에 추가한다.


(추가한 옵션 변수)


여기에 옵션을 사용자로부터 입력받아 저장한다.



(실행 코드)


실행시 이 변수를 옵션 뒤에 붙여서 실행해준다.



(실행 모습)


옵션을 입력받는 모습이다.
여기서 경고문구로 정확히 잘 모르면, 사용하지 말라 라는 경고문을 넣었다.

왜냐하면 부정확한 옵션을 입력으로 넣게 되면 스캔 작업때 에러가 나기 때문이다.


(입력된 옵션)


입력을 받게 되면 스캔 메뉴에서 직접 어떤 옵션이 들어가있는지 확인 할 수 있다.


(실행 모습)


실행시 매우 잘 동작하였다.

아무리 경고를 해놨다 해도, 이에 대해 잘 처리를 안해두면 훌륭한 프로그래머가 아니다.


(에러 모습)


분명 이런 에러가 나올 것이다.

이를 막기 위해 예외 처리를 하였다.



(예외 처리)


예외처리를 하였다. 총 스캔하는 코드가 3부분 있었는데 그 곳에 이렇게 예외처리를 하였다.


(예외처리 모습)


부정확한 옵션으로 인한 에러가 나게 되면

에러를 출력한다. 그리고 현재 입력된 옵션을 지워주게 만들었다.



(옵션 삭제)


옵션이 삭제된 모습이다.

마지막으로 update 기능을 구현하려 했으나,

깃헙에 올려서 배포를 한 후, 깃헙을 이용해 업데이트 작업을 진행할 계획이어서 여기서는 구현하지 않았다.


(update 미 구현)


그래서 이 버전에서는 업데이트 명령이 지원되지 않는다는 문구를 남겨주었다.

이로써 스캐너 작업을 마무리 함으로써
커피넷이라는 프레임워크에서 스캐너가 완성이 되었다.
아직 도구가 하나 밖에 없지만, 커피넷이라는 프레임워크가 완성됬다.

이제 남은 작업은 깃헙 페이지에 올려서 배포하기 위해
README 이런것들을 작성할 예정이다.

오늘 구현한 기능
- custom 메뉴 기능 구현 (커스텀 옵션 설정기능)
- 그 외 마무리 작업 (스캐너 완성)

현재까지 구현한 기능
1. Framework 내 tool import 등록, 연동
2. 각 Framework의 기능 구현(list, use, info, exit)
3. scanner의 인터페이스 설정 부분, 설정된 인터페이스의 IP정보 구하기.
4. scanner의 host scan 기능
5. scanner의 detail scan default기능
6. detail 결과 전체 출력기능(ip, mac, vendor ,os)
7. db 메뉴 생성 및 scanner의 오픈 포트 출력 기능
8. detail 스캔의 예외모드 기능 구현
9. nmap의 호스트 스캔 성능 고민.
10. nmap의 속도 개선 고민.
11. custom 메뉴 기능 구현 (커스텀 옵션 설정기능)


다음 계획
1. github 페이지 업로드 준비 및 업로드


지난 프로젝트에서의 계획
1. detail 스캔의 예외모드 기능 구현
2. Framework의 update 기능 구현
3. nmap의 호스트 스캔 성능 고민.
4. nmap의 속도 개선 고민.

-> 오늘 구현한 것은 먼저 detail 스캔의 예외모드 기능을 구현해보았다.
그리고 nmap의 스캔이 오락가락했던 것에 대해 고민해보고,
nmap의 속도를 개선시키기 위해 고민해보았다.

그리고 추가적으로 메뉴를 조금씩 바꾸고 있다. 아래는 스캐너 모듈의 스캔 메뉴를 조금 바꾸었다.



(스캔 메뉴)


스캔 메뉴에서 Target IP 라는 것을 Target Network라고 바꾸었다. 타겟 설정이 불필요해 보여서 현재 공격 대상의 네트워크 대역을 표시해 주는 것으로 하기로 했다. 그리고 타겟 설정 메뉴를 없앴다. 단순히 detail 뒤에 인자로 아이피 주소를 주면 해당 대역을 스캔해 주므로, 불필요하다고 생각했다.
그리고 추가적으로 nmap의 옵션을 사용자 입맛에 맞게 옵션을 줄 수 있도록 custom 메뉴를 만들었다.
이 메뉴를 통해서 사용자는 자기 입맛대로 nmap의 옵션을 설정할 수 있다.

그리고 detail 스캔의 예외 모드이다.
예외 모드란 host 스캔 없이 바로 detail 스캔메뉴로 들어온 경우이다.

이럴 경우 기존 host 데이터가 없으므로 detail 스캔을 진행하지 못하므로, ip 주소를 입력받아 해당 ip 주소를 detail 스캔 하는 방식으로 작성하였다.


(detail 스캔 예외모드)


실행하면 다음과 같이 잘 동작하는 것을 확인하였다.


(동작 확인)


그리고 추가적으로,
detail 뒤에 ip 주소를 인자로 던저주면 해당 ip에 대해 detail 스캔을 해주는 기능을 추가했다.

코드에서는 두번째 인자를 ip 형식이 맞는지 체크하는 루틴을 위에서 만든것과 같이 똑같이 만들었다.



(동작 확인)


동작이 잘 되는 것 확인!
위에 두개가 뜬 것은 제일 먼저 192.168.0.1 에 대한 정보가 있는 상태에서
추가적으로 192.168.0.4 를 스캔하여 192.168.0.4의 정보가 추가 된 상태로 보여주기 때문이다.

그 다음 고민한 것이 스캔 속도였다.
호스트 스캔의 경우 여러 대의 호스트여도 빠르게 스캔이 가능하였다.
하지만 detail 스캔의 경우 20대 정도만 되도, 기다리는게 한 세월이었다.

그래서 찾아본 결과 -T 옵션이 아래와 같은 기준으로 세부 옵션을 설정해주는 거였다.


(-T 옵션)


여기서 나는 디테일 스캔에서 -T5 옵션을 사용하기로 결정했다.
-T5 의 경우 빠르긴하지만, 단점이라면 트래픽이 많고 시끄럽다는 것이다.

그런데 카페 같은 소규모 네트워크에서 사용할 프레임워크로써 그러한 소음에는 덜 민감해도 된다고 판단하였고, 카페같은 무선랜을 주로 사용하는 곳에서는 호스트가 유동적으로 연결 되었다 해제된다. 그러기에 빠르게 스캔할 줄 아는게 굉장히 중요하다고 판단하여 -T5 옵션을 사용하기로 결정했다.


(-T 옵션 장착)


그 외로 이제 정상적인 스캐너의 기능을 할 줄 알게 되는 스캐너를 구현하였다.



(스캐너 구현)


마지막으로, 스캐너가 오락가락하는 것에 대해 고민해보았다.
내가 실험했던 곳은 무선랜이 대다수였는데, 안되는 곳의 특징을 살펴보니, 주파수 간섭이 심한 곳이었다. 이런 곳에서는 --scan-delay를 조금 길게 설정해주니, 안잡히던 호스트도 잡히고 하는 현상을 발견했다. --scan-delay는 스캔하고 기다리는 시간을 주는 것인데, 주파수 간섭이 심한 곳 같은 경우에는 패킷이 전송실패할 경우가 많기 때문에 이 시간을 조금 늘려주는 것이 안전하였다.

-> 이런 경우 custom 옵션을 사용하여 추가해주거나, 이러한 경우를 위한 메뉴를 하나 더 설정할 생각이다.

오늘 구현한 기능
- detail 스캔의 예외모드 기능 구현
- nmap의 호스트 스캔 성능 고민.
nmap의 속도 개선 고민.

현재까지 구현한 기능
1. Framework 내 tool import 등록, 연동
2. 각 Framework의 기능 구현(list, use, info, exit)
3. scanner의 인터페이스 설정 부분, 설정된 인터페이스의 IP정보 구하기.
4. scanner의 host scan 기능
5. scanner의 detail scan default기능
6. detail 결과 전체 출력기능(ip, mac, vendor ,os)
7. db 메뉴 생성 및 scanner의 오픈 포트 출력 기능
8. detail 스캔의 예외모드 기능 구현
9. nmap의 호스트 스캔 성능 고민.
10. nmap의 속도 개선 고민.

다음 계획
1. custom 메뉴 기능 구현 (커스텀 옵션 설정기능)
2. Framework의 update 기능 구현
3. 그 외 마무리 작업.


지난 프로젝트에서의 계획
1. 오픈포트 정보, 서비스를 확인할 수 있는 기능 추가
2. detail 스캔의 예외모드 기능 구현
3. Framework의 update 기능 구현

이 중오늘 구현한 것은 detail 스캔의 오픈된 서비스 정보를 출력하는 것을 구현하였다.
이를 위해 어떠한 인터페이스가 좋을지 고민을 해보았는데,
db 라는 메뉴를 하나 더 만들어서

db 메뉴에서 지금까지 스캔한 정보에 대한 정보를 선택해서 볼 수 있는 메뉴를 만드는게 좋을 것 같았다.



(추가한 db메뉴)


db 메뉴에 들어가면 아래와 같다.


(db 메뉴)


db 메뉴에 들어가면 현재 스캔된 호스트 정보의 개수를 알려준다. 현재 7개가 들어있다.

- host 메뉴에서는 호스트 리스트를 출력해준다.
- service 메뉴에서는 오픈된 포트를 출력해준다.
- back 메뉴는 Scanner 메뉴로 돌아간다.
- help 메뉴는 db 메뉴에 관한 help를 만들었다. 이유는 db에서 사용하는 명령어에 대해 알려주는 게 있어야할 거 같아서 메뉴만 만들어두었다.

host 리스트 정보 출력



(호스트 리스트)


여기서 service [ip] 이렇게 입력하면

입력된 ip에 열려있는 포트 정보를 출력해준다.



(open 된 port 정보)


예외적으로 호스트된 정보가 없다면 데이터가 없다고 출력해준다.



(호스트 정보 없음)


service 메뉴에 관한 코드는 아래와 같다.



(service 메뉴)


현재 1개의 IP 정보가 추가적으로 들어와서 그 IP정보에 대한 오픈 포트의 정보를 출력하게 만들었다.
아무것도 없이 service만 입력을 하면 호스트 전체의 service를 출력하도록 하는 코드로 만들 것이다.

오늘 이어서 만들다 보니 또 문제점을 발견하였다.
-> nmap이 오락가락? 한다.
호스트가 잡힐 때가 있고 안잡힐 때가 있다. 기본적으로 가장 중요한 Gateway도 잡혔다 안잡혔다 한다...
이유는 잘 모르겠다. 어떤 때는 Gateway까지 전부 완벽하게 스캔되고,
어쩔 때는 잘 안된다.

wireshark로 분석을 해본 결과 nmap은 ip대역을 넣어주면, 처음 arp 스캔을 한다.
그리고 arp 스캔 결과를 가지고 추가적인 작업을 하는 것을 확인했다.
분명 gateway가 arp 응답을 했음에도 불구하고, host-down이라고 뜰 때가 있었다.

ping gateway는 너무너무 잘나간다.
그리고 바로 이어서 핑스캔으로 현재 로컬 ip대역으로 설정한 후 실행하면 게이트웨이가 안잡힐 때가 있다.
(?!)
정리하면
nmap -sP -sn 172.30.1.0/24   ->  gateway 안잡힘.
nmap -sP -sn 172.30.1.254    -> 254가 게이트웨이인데, 이렇게 하면 잡힘.

하아.. 성능을 높이기 위해
ping 스캔을 직접 구현해야하나 고민 중이다.
추가적으로 detail 스캔할 때 느리다는 단점이 있었다.
물론, 카페같은 소규모 네트워크를 위한 프레임 워크이지만, 호스트 대수가 20대가 넘어가면
세월아 내월아 함흥차사다.
적어도 50대까지는 나름 그래도 잘 커버할 수 있게 만들어야 될거 같다.
지금 생각으로는 thread를 이용하여 스캔방식을 달리할 생각이다.
nmap 자체에서 thread를 이용하는거 같았는데, 이 또한 자세히 조사해서 알아봐야할 듯 싶다.

오늘 구현한 것에 비해 해야할 일들이 더 늘은 느낌이다...!
(아! detail scan을 출력하는 기능은 다른 곳에다 엮을 생각이다.)

오늘 구현한 기능
- scanner의 오픈 포트 출력기능
- db 메뉴를 새로 만듬.

현재까지 구현한 기능
1. Framework 내 tool import 등록, 연동
2. 각 Framework의 기능 구현(list, use, info, exit)
3. scanner의 인터페이스 설정 부분, 설정된 인터페이스의 IP정보 구하기.
4. scanner의 host scan 기능
5. scanner의 detail scan default기능
6. detail 결과 전체 출력기능(ip, mac, vendor ,os)
7. db 메뉴 생성 및 scanner의 오픈 포트 출력 기능

다음 계획
1. detail 스캔의 예외모드 기능 구현
2. Framework의 update 기능 구현
3. nmap의 호스트 스캔 성능 고민.

4. nmap의 속도 개선 고민.


지난 프로젝트 일지에서의 계획이다.
1. Framework의 update 기능 및 info 명령시 각 명령어에 대한 설명 추가.
2. Scanner 제작.

아직 1번은 못했다. (하기는 쉽지만, 귀찮아서... 하지만 조만간 곧 1번은 마무리할것이다.!! 미루는 것은 안좋으므로!)
오늘은 지난 계획 중 2번 스캐너 제작에 돌입했다.

오늘은 스캐너 제작에서 첫 단계인 현재 내 컴퓨터에서 인터페이스를 설정하고, 해당 인터페이스의 IP주소, Gateway 주소, Netmask 정보를 구해오는 작업을 했다.

Python의 netifaces 라이브러리를 사용했다.

제일 첫 단계로 인터페이스를 잡아야한다.!


(인터페이스 리스트)


netifaces 라이브러리의 interfaces 함수를 사용하면 현재 호스트의 인터페이스 리스트가 반환된다.


(결과)


루푸백 인터페이스와 eth0 인터페이스 2개가 나온 것을 확인 할 수 있었다.

이걸 가지고 scanner 시작할 때 원하는 인터페이스를 선택하도록 할 것이다.

인터페이스가 설정 되었으면 그 인터페이스의 ip 정보를 확인해 볼 수 있다.


(ifaddresses)


ifaddresses 함수를 사용한다.



(결과)


결과 해당 인터페이스의 ip정보가 나온다. 난 IPv4를 사용할 것이다.


(AF_INET)


(AF_INET)


IPv4리스트의 첫번째 원소가 IPv4의 정보이다. 타입은 사전형이므로

'addr' 키를 넣으면 해당 ip 주소 데이터가 나온다.


(결과)


로컬 호스트의 ip 주소를 구하는 것 까지 했다.

이제 gateway 주소를 얻어올 것이다.

gateway정보는 gateways 함수를 사용하면 된다.


(gateways() 함수)


(결과)


이 중에서 default를 사용할 것이다.

그러면 기본 gateway의 주소를 구할 수 있게 된다.


(gateway주소)


(결과)


gateway의 주소를 구했다.

이제 인터페이스가 연결되어있는 네트워크의 사이즈를 파악하기 위해 netmask를 구해야한다.

netmask 정보는 아까 ifaddresses 함수의 결과 안에 있었다. 거기서 netmask 정보를 가져온다.


(netmask)


(결과)


netmask 정보까지 구했다.

이제 netmask의 정보를 가지고 cidr도 구할 수 있으며, 이를 이용해 네트워크 호스트 스캔을 할 때 이용할 수 있을 것이다.

지금까지 알아본 정보로 CoffeeNet 프로젝트에 기능을 추가했다.


(CoffeeNet 의 Tool, Scanner)


함수는 파일을 분리하여

scan_func 파일을 만들어 스캐너에 필요한 함수를 전부 여기다 정리해 둘 것이다.


(scan_func.py)



그러면 지금까지 정리된 툴을 실행시켜보겠다.



(use scanner)


scanner를 사용한다고 말한다.

그러면 인터페이스를 설정하는 선택지가 나온다.



(번호 선택)


여기서 번호만 적어도 되고, use [숫자] 이렇게 적어도 가능하도록 만들었다.

인터페이스를 잡게되면

처음 Scanner시작화면이 뜨게된다.



(Scanner 화면)


스캐너 화면에는 해당 선택된 네트워크 인터페이스 정보를 보여준다.
그리고 현재 로컬 IP주소와 Gateway 주소를 보여주게 만들었다.

오늘 구현한 기능
- scanner의 인터페이스 설정 부분, 설정된 인터페이스의 IP정보 구하기.

현재까지 구현한 기능
1. Framework 내 tool import 등록, 연동
2. 각 Framework의 기능 구현(list, use, info, exit)
3. scanner의 인터페이스 설정 부분, 설정된 인터페이스의 IP정보 구하기.

다음 계획
1. Framework의 update 기능 및 info 명령시 각 명령어에 대한 설명 추가.

2. 선택한 인터페이스의 IP대역에 있는 호스트 스캐닝 구현

 최근 Veil Framework 소스코드를 분석해보다가, 나도 만들 수 있겠는데? 라는 자신감이 들었다.
그리하여 내가 직접 tool을 개발해보기로 했다.

아주 그럴싸하게 여러개의 tool을 통합해서 사용할 수 있는 Framework를 간단하게 만들 것이다.
그리고 그 안에 tool을 개발하여 통합시킬 계획이다.

프로젝트 이름은 CoffeeNet이다.
나는 소규모 Network를 공격하기 쉽게 이러한 프로그램을 만들기로 결심했다.
CoffeeNet 프레임워크 안에 앞으로 개발할 도구는 2가지이다.
1. Scanner
2. Sniffer

첫번째 도구는 스캐너이다. 해당 네트워크에 살아있는 호스트를 탐색하고, 열려있는 포트 등을 체크하기 위한 도구로 사용할 것이다.
두번째로는 sniffer 환경을 구축하는 도구를 만들 것이다. ARP Spoofing, Evil twin 등 해당 네트워크안의 패킷들을 스니핑 할 수 있는 환경을 구축하는 도구로 사용할 것이다.

그리고 CoffeeNet 프레임 워크에서 1번도구와 2번 도구를 자동화시켜서 알아서 결과까지 내보이는 기능을 탑재시키는 것이 최종 목표이다.

먼저 프레임 워크 틀을 만들었다.



(main menu)


위 화면은 메인메뉴이다.
실제 Framework처럼 만들고 싶었다. (만들다보니 퀄리티에 욕심이 자꾸 났다.)

CoffeeNet은 사용자와 직접 대화하듯 interactive하게 만들었다.

list 기능 구현이다.


(list)


list 명령을 입력하면 현재 import된 툴 이름을 출력해준다.


use 명령


(use)


use 명령 뒤에는 해당 툴 번호 혹은 툴 이름을 입력해주면 된다.
그렇게 되면 해당 툴이 실행된다.

하지만 아직 안에 내용물은 없는 껍데기만 만들어놨다.

info 명령


(info)


info 명령시 help와 같은 기능을 한다.
인자 없이 info 명령을 하면 이 툴에대한 간단한 소개를 해주고, 각 명령어의 사용법을 알려준다.
(아직 모든 명령어의 설명을 등록하지 못했다.)

info 명령어 뒤에 툴 이름을 적으면


info [tool_name]



해당 툴의 간단한 설명이 나온다.

exit 명령어


(exit)


exit 명령을 하게 되면 프로그램을 종료시켜준다.

update 기능은 앞으로 추가할 내용이다.

큰 구조는 아래와 같다.


(CoffeeNet 구조)




현재 구현한 기능
1. Framework 내 tool import 등록, 연동
2. 각 Framework의 기능 구현(list, use, info, exit)

다음 계획
1. Framework의 update 기능 및 info 명령시 각 명령어에 대한 설명 추가.

2. Scanner 제작.

이제는 views.py를 작성해 볼 것이다.

views 와 url을 연결하는 것은 지난 포스팅에서 다루었다.
이제 그 views.py를 작성 할 것이다.

개발환경이 바뀌었다.!!!!
우분투 너무 느렸는데, CentOS로 옮겼다. 아주 쾌적하고 좋았다. :)

우리는 4개의 view를 만들어야했다.
1. index : 설문지 리스트를 보여주는 view
2. detail : 특정 설문지에 들어가서 선택지들을 보여주는 view
3. vote : 선택지를 선택한 것에 대한 처리를 담당하는 view

4. results : 설문 결과를 보여주는 view


(views.py)


위와 같이 간단히 작성할 것이다.
지금 단계로는 우리가 계획한 view를 바로 설계할 수 없다.
위에 작성한 코드들은 해당 페이지와 연결을 하는 것을 해보기 위해서이다.
보면 view에 인자들을 살펴봐야한다.

첫번째 인자는 request 로 요청에 대한 객체이다.

두번째 인자는 넘겨 받는 인자인데, 우리가 urls.py를 작성할 때 url 주소에서 파싱한 내용들이다.


(polls/urls.py)


polls/urls.py 에 주소 패턴에 넘겨주는 인자가 있다.

이대로 실행해보자.
polls/3  의 주소를 요청하게 되면

뒤에 3이 question_id 라는 변수에 들어가서 넘겨가는 것이다.



(실행 화면)


3이라는 숫자가 question_id로 넘어가서 화면에 저렇게 표시 되는 것을 확인 할 수 있다.


이제 실제로 view에서 무언가를 처리하는 것을 넣을 것이다.
위에서는 단순하게 인자를 넘겨받는 것 까지만이었다.

최근 설문지 5개를 가져와서 출력하는 것을 해보자!



(views.index)


latest_question_list에 최신의 설문지 5개를 가져온다. 반복자형식이다.
그리고 해당 설문지의 설문내용을 하나씩 붙여서 output에 넣고
그 output을 화면에 출력해주는 코드이다.

확인!


(확인)


확인해보니 설문내용이 출력되는 것을 확인 할 수 있었다.

장고는 모델과 뷰, 템플릿이 따로 관리되는 MTV 구조를 가지고 있다.
그에 따라 우리도 템플릿을 만들어서 여기서 보여주는 것을 해볼 것이다.

템플릿은 settings.py 파일에서 INSTALLED_APP 디렉토리에서 하위 templates 디렉토리를 탐색한다.
고로 우리는 polls/templates 를 만들어야한다.

여기서 다시 polls 디렉토리를 만든다.
정리하면,
polls/templates/polls
이렇다.

이유는 장고가 템플릿을 찾을 때 이름이 일치하는 첫번째 템플릿을 가져온다.
그렇다면 동일한 템플릿 이름이 다른 APP에도 있다면? 어떻게 구분할 수 있을까?
그렇기 때문에 templates디렉토리 아래에 해당 어플 이름으로 디렉토리를 하나 더 만들어 주어서
템플릿에 이름을 구분시켜주는 것이다.

polls/templates/polls/index.html 을 만들자!



(polls/templates/polls/index.html)


위 템플릿은 latest_question_list 를 넘겨받는다.

코드 설명
latest_question_list에서 하나씩 가져와서 question에 넣으면서 반복한다.
question의 id 값을 이용해 링크 걸린 문구를 출력한다.

만약 가져올 설문이 하나도 없다면
설문이 없다고 출력한다.

이렇게 템플릿을 만들었으니

우리는 view에서 이 템플릿과 연결해야한다.



(polls/views.index)


template에 템플릿을 가져오고
context 에 latest_question_list 변수를 지정한 사전형 자료를 담아둔다.

그리고 template.render를 해주면 된다.



(결과)


이렇게 실행하게 되면
웹 페이지에서 링크로 출력되는 것을 확인 할 수 있다.

여기서 의문이 든다.
템플릿 로드하고, 변수 저장하고 템플릿 렌더해서 HttpResponse로 넘겨준다.
너무 루틴하지 않은가?
우리의 파이썬이 이걸 가만 놔둘리 없다.

단축기로 render라고 만들어두었다.
이 모든 과정을 한방에 해준다.

단축기를 사용해보자.



(단축기 사용)


render를 사용하면 위의 과정을 한번에 해준다.
단순히 템플릿을 지정해주고, 넘겨줄 변수를 사전형으로 만들어서 넘겨주면된다.

views에서 처리해야할 일이 또 뭐가 있을까?
바로,
에러처리다.

웹 페이지에서 대표적인 에러는 바로 404 에러이다.
해당 웹 페이지가 없는데 요청하는 것이다.
예를 들어 /polls/24  -> 만약 id가 24가 없다면 해당 페이지는 준비 되지 않은것이다.

404 에러 처리를 해보자!



(404 에러처리)


파이썬의 try except 구문을 사용한다.
해당 쿼리를 날려서 설문지를 가져오는데 만약 그게 없다면
404 에러를 반환한다.

실행하기 위해 detail.html을 만들어야하는데 형식상 만드는 것이므로 지금은 아주 간단히 작성한다.



(polls/templates/polls/detail.html)


없는 인덱스로 실행해보자.


(404 에러)


우리가 적은 Question does not exist 보이는가?
우리가 404 에러 처리를 하였다.

그렇다면 여기서도 또 의문이 든다.
try except 구문
왠지 많이 자주 쓰일 것이다.

그렇다!
이것 또한 단축기로 만들었다.!!!!
get_object_or_404 를 이용하면 해당 객체를 가져오는데 만약 없다면 404 에러를 내는 

우리가 위에서 했던 것을 한방에 해주는 함수다.



(단축기 사용)


실행해본다.



(실행 결과)


똑같이 404 에러가 떴다.
다만 에러 문구는 다르다!

이제 detail.html 템플릿에서

선택지를 보여주는 작업을 해볼 것이다.



(polls/templates/polls/detail.html)


해당 템플릿에서
question 객체를 받았다.
설문지에서 선택지를 전부 가져와서 하나씩 choice에 넣고
choice의 선택지를 출력해주는 것을 반복하는 코드이다.

실행해보면

(실행)


선택지들이 나열되어 나온다.


index 템플릿에서 detail 템플릿을 호출하였다.



(index 템플릿)


index 템플릿에서
/polls/ 
이렇게 url주소가 하드 코딩되어있다.

그렇다면 만약 detail 템플릿의 url이 바뀌면
이렇게 하드코딩된 주소를 찾아서 일일히 다 바꿔야할까?
그렇기 때문에 url 주소를 간편히 쓸수 있는 것이 있다.


(하드코딩 제거)


위처럼 {% url '이름' %} 이렇게 쓰면 된다.

그렇다면 저 url은 뭘까?


(urls.py)


우리가 urls.py에서 마지막 인자로 name 인자를 둔 것이 기억날 것이다.
이것이 우리가 url패턴을 각각 이름으로 정한것이다.

그렇기에 detail url을 쓰고 싶다면
{% url ' detail' %} 이렇게 쓰기만 하면 되는 것이다.

그렇다면 이 이름이 겹치는 것을 생각해봐야한다.
우리는 APP을 여러개 만들 건데 그 url마다 이름을 다 다르게 해야하는 건 너무 힘든 일이다.
다른 APP에 detail이라는 url 이름이 있을 수 있기 때문이다.

이걸 방지하기 위해 app_name을 지정해 줄 수 있다.



(APP 이름 지정)


위 처럼 app_name을 지정해주면 polls에서 사용하는 detail 이라고 알 수 있다.

그렇다면 당연히 아까 적은 url 표기도 바꾸어 주어야한다.


(url 표기 변경)


polls:detail
이렇게 바꾸면 된다.

(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial03/)


+ Recent posts