오늘은 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. 호스트 리스트를 가지고 디테일 스캐닝 기능 구현
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. 선택한 인터페이스의 IP대역에 있는 호스트 스캐닝 구현

Framework의 update 기능 구현은 스캐너 툴을 완성시킨 후, github페이지에 올린 후에 구현할 것이다.!
info 명령시 각 명령어에 대한 설명 추가! scanner 툴에 대한 설명을 추가하였다.
그리고 선택한 인터페이스의 IP대역에 있는 호스트 스캔을 구현하였다.

info 명령 추가이다.

각 명령어의 사용법을 추가하였다.


(명령어 사용법 추가)


그리고 각 도구에 대한 설명을 추가하였다.


(스캐너 툴 설명 추가)


이번에 구현한 기능은 호스트 스캔 기능으로
해당 네트워크 대역에 살아있는 호스트들을 확인하는 기능이다.
나는 패킷을 직접 만들어 구현하지 않고, nmap의 기능을 이용했다.
python3의 nmap 모듈을 설치하여 사용했다.

nmap 모듈에 대한 설명이 많지 않았다...
그렇기에 python3 nmap 파일을 직접 열어서 확인해봐야했다.

nmap에는 PortScanner 클래스가 있고 이 클래스를 생성해 nmap 스캔 작업을 한다.

PortScanner 뿐 아니라 다른 기능의 클래스들이 있다. 비동기화스캐너라고 콜백함수를 이용하는 스캐너가 있었는데, 이거 잘쓰면 재밌는 기능을 구현할 수 있을 듯했다.



(포트스캐너 생성)


생성한 nmap 클래스 nm을 scan_menu에 전달하여 구현하였다.



(호스트 스캔)


호스트 스캔을 하고 아래에는 각 정보를 Tool 클래스의 hosts 사전형 변수에 저장한다.
기능을 구현하고 보니 지저분하다는 생각이 들었다.
scan_menu 함수 안에 두기 지저분하니 이걸 함수로 옮겨야겠다.(다음에 옮길 것이다.)

그리고 가지고 있는 hosts 정보를 출력할 함수도 scan_func에 구현하였다.
scanner 툴에 스캔한 호스트 정보를 출력해주는 기능이 있는데, 그 때 이 함수를 호출할 것이다.

(정보는 더 많게!)


(정보 출력 함수)


실행 모습이다.


(스캔 중인 모습)


스캔 결과 아주 흡족하게 나왔다.



(스캔결과)


이 정보 만 가지고는 부족하다.
이 호스트 정보를 가지고 디테일한 스캐닝을 하는 기능을 구현 할 것이다.


오늘 구현한 기능
- scanner의 host scan 기능
- Framwork의 info 명령 추가

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

다음 계획
1. 호스트 리스트를 가지고 디테일 스캐닝 기능 구현

2. 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대역에 있는 호스트 스캐닝 구현

 최근 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 제작.

+ Recent posts