지난 프로젝트에서의 계획
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. 호스트 리스트를 가지고 디테일 스캐닝 기능 구현
2. Framework의 update 기능 구현

이번에 구현한 것은 디테일 스캐닝의 기능을 구현했다.



(detail 명령)


추가한 코드 시작부분이다.


(코드)


detail 명령시 기존에 있던 hosts 리스트에 있던 ip들을 대상으로 detail하게 scan을 한다.
원래 순서는
host scan을 한 후 detail scan을 한다고 가정을 했기 때문에 default로는 host scan의 결과가 target ip가 된다.
그러나 host scan이 없어서 hosts리스트가 없다면 특정 IP를 입력 받을 수 있도록 만들었다.
이 때 정규식 표현을 통해 IP 형식인지를 체크한다.
* 아직 detail 스캔의 예외모드는 구현하지 않았다.

default 방식인 host 스캔을 했다는 가정을 한 디테일 스캔을 완성하였다.


(스캔 옵션)


디테일 스캔 옵션으로는 스텔스하게, 운영체제 탐색, 서비스버젼 탐색을 넣었다.
그리고 기존 hosts 사전에서 담겨있던 mac, vendor 정보를 저장해둔다.
마지막에 사전으로 다시 저장할 것이다.

운영체제, 오픈 포트 및 서비스를 분석하여 사전으로 저장한다.


(스캔 정보 저장)


이렇게 저장된 스캔 결과를 확인'해보았다.


(호스트에 저장된 정보)


이제 이 정보들을가지고 화면에 출력해주면 된다.

이번에 구현한 기능은 detailscan의 결과를 출력하는 함수를 만들었다.


(detailscan 출력)


아이피, 맥, 벤더, 운영체제  이렇게 4가지의 정보를 나열해서 보여주게 만들었다.


(구현 결과)


Detail Scan 기능을 구현하였다.

오픈 포트정보와 함께 서비스도 알아내었는데, 그 정보를 아직 출력하는 기능은 넣지 않았다.
추가적으로 다음에 오픈포트 정보도 확인할 수 있는 기능을 추가할 것이며, detail 스캔의 예외 모드를 구현할 것이다.

오늘 구현한 기능
- scanner의 detail scan default기능
- detail 결과 전체 출력기능(ip, mac, vendor ,os)

현재까지 구현한 기능
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)

다음 계획
1. 오픈포트 정보, 서비스를 확인할 수 있는 기능 추가
2. detail 스캔의 예외모드 기능 구현

3. Framework의 update 기능 구현


지난 프로젝트 일지에서의 계획이다.
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대역에 있는 호스트 스캐닝 구현

+ Recent posts