지난 프로젝트 일지에서의 계획이다.
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 제작.


이 문제도 하루 정도 걸려서 풀게 되었다..

취약점을 쉽게 발견했지만 RSA 관련해 이해해야할 부분이 있었고
그 부분에 있어서 시간이 좀 걸렸다.

RSA 암호기법은 정보보안기사 공부할 때도 했고, 암호 공부할 때도 했었는데
실제로 암호화 과정, 복호화 과정을 대강 이렇다~ 하고 넘어갔기 때문에
문제를 풀 때 다시 공부를 해야했다.

이 문제를 풀면서 암호화, 복호화 과정을 철저하게 되집은 점이 가장 기분 좋았다.

먼저, 문제 프로그램의 보호기법을 확인하였다.


(보호기법)


오랜만에 pwnable.kr 의 문제를 풀어서 그런지 조금 새로웠다.
이유는 다른 대회문제나 다른 사이트의 포너블같은 경우
아주 당연하게 PIE, NX 기본적인 보호기법이 설정 되어있는데
pwnable.kr의 루키 문제라서 그런지 보호기법이 거의 없었다. 여기서는 카나리 하나 적용되었다.
(그리고 바이너리파일에 C코드 심볼이 첨부되어있어서 읽기도 편했다.)

바이너리 파일을 직접 핸드레이를 하고 전체적인 과정을 파악해 보았다.
크게 첫번째로 RSA 암호화의 p,q e, d를 설정하는 과정이 있다.

그리고 암호화를 위해 선택지2번을 입력하면 아래와 같이 나온다.


(암호화)


읽을 데이터 길이를 입력받는다.
그리고 데이터를 입력받는다.

여기서 조금 특이한 과정이 있었는데, 그 이유는 모르겠다.
의도적으로 이상하게 만든건지 이유가 있어서 그런건지.
특이했던건
입력을 fread로 받는데, 1바이트씩 받는다.

그래서 스택의 어느 변수에 하나씩 받아 온 후, 한 자씩 어느 글로벌 배열변수에 저장한다.



(평문 버퍼)


바로 이곳에 한자씩 저장을 한다.

그리고 이 버퍼에서 한 자씩 다시 가져와서 암호화 과정을 걸 친 후 글로벌 배열변수(암호화버퍼)에 저장한다.



(암호문 버퍼)


위 암호문 버퍼에 저장하게 된다.

그리고 이 버퍼에 있는 것을 다시 한자씩 출력용으로 데이터를 가져와서 스택에 저장한 후
그 스택에 있는 것을 출력한다.

위의 과정을 걸쳐 암호화가 진행된다.
여기서 취약한 점은 바로 버퍼 크기이다.
평문 버퍼와 암호문 버퍼 같은 사이즈로 설정해놓았다. 그리고는 평문에서 한자씩 가져와서 RSA 과정을 걸쳐서 암호문 버퍼에 저장한다.
그런데 평문버퍼의 1바이트를 가져와서 RSA 암호화를 거치면 4바이트가 되는데 이 것을 암호문 버퍼에 저장을 하기 때문에 암호문 버퍼는 당연히 넘치게 된다.

(overflow)


바로 아래에 있는 func 배열 변수까지 넘쳐버렸다.

암호문 버퍼에 있는 것을 스택으로 옮기는 과정에서도 마찬가지다. 그렇기에 스택도 overflow 낼 수 있다. 하지만 스택 카나리가 있기 때문에 메모리 leak할 방법을 찾아내어야한다.
그렇기에 나는 암호문 버퍼를 overflow하여 func 배열변수를 덮어쓸 생각을 했다.
func 배열 변수에는 함수 주소들이 있다. func[0] 에는 set_key 함수 주소가 들어있었는데,
이 주소를 덮어쓴 후, set key를 실행시키면 우리가 덮어쓴 주소가 시작되게 할 것이다.

나는 평문버퍼 앞부분에 쉘코드를 넣고, func[0] 에다가 평문버퍼의 주소를 덮어쓸 생각을 했다.
왜 자신있게 했느냐 하면, NX가 설정되어있지 않기 때문에!! 이럴때 쉘코드를 마구마구 맘껏 써야겠다는 생각이 들었다.

그렇다면 이제 문제는 어떻게하여 평문버퍼의 주소 0x602560으로 설정할 것인가 였다.
(*평문버퍼의 주소를 확정할 수 있는 이유는 바로 PIE가 설정되어있지 않기 때문에 고정적이기 때문이다.)
한 글자, 즉 0~255의 숫자를 RSA하여 0x602560으로 만들어야한다.
여기까지는 금방 파악했으나 평문버퍼의 주소를 만들기 위해 시간이 꾀 걸렸다.

RSA 암호화 과정
pow(m,e) % N = c
m은 평문이고 c는 암호문이다.

우리는 c가 0x602560이기만 하면 된다.

이것저것 시도하다가 생각이 트인 때가 있었다.


(p,q 설정과정)


p,q,d,e를 설정하는 부분인데
실제 RSA 에서는 P와 Q는 굉장히 큰 소수여야한다.
소수!!

하지만 이 프로그램에서는 소수인지 검사하지 않는다. (아마 그렇게 되면 프로그램이 무거워져서 그랬나?)
무튼, 여기 프로그램에서는 p와 q가 소수가 아니어도 된다는 점!
그렇기에 값을 마구마구 설정해서 원하는 c(암호문)값만 만들 수 있으면 된다는 거였다.

pow(m, e) % N = 0x602560
10진수로 쓰면
pow(m, e) % N = 6301024 이고
다시 정리하면
N * a + 6301024 = pow(m, e)
여기서 m은 14, e는 7이라고 설정했다.
그래야 6301024의 근처 숫자가 되기 때문이다.
그렇게 되면 
N * a = 99112480
이 되고, N은 6301024 보다 큰 조건을 만족하고, 작은 N의 값을 12389060 으로 설정했다.

그러면 p,q 값을 찾아야하는데
이 값은 잘 정해야한다. 이유는 p,q값이 char로 설정되어있기 때문에 0x0000~부터 0x7FFF 까지의 숫자여야한다.(64비트이기 때문)


N이 12389060 이기 때문에 p,q를 1217, 10180으로 설정했다.

그리고 우리가 원하는 평문버퍼 주소(0x602560)으로 나오는지 확인해보았다.



(확인)



(확인 결과)


확인해보니
딱 나왔다!

이제 끝났다!

func[0]부분까지만 덮어쓰려면 265만큼 넣으면 된다.



(265 바이트 입력)



(결과모습)


결과 딱 func[0] 까지만 덮어쓰여진 것을 볼 수 있다.

이제
페이로드 앞부분에는 쉘코드를 올리고
나머지 241바이트
그 후 0x0e  값을 보낼 것이다.
마지막 바이트가 RSA 과정을 거쳐 평문버퍼의 주소가 된다.

exploit을 작성했다.



(쉘코드 및 변수 설정)



(exploit)



(exploit 결과)


문제 풀이 끝

'WarGame > 500 Project' 카테고리의 다른 글

(67/500) pwnable.kr - note  (0) 2018.03.29
(65/500) pwnable.kr - echo2  (0) 2018.03.08
(64/500) backdoor - Enter the matrix  (0) 2017.10.31
(63/500) pwnable.kr - syscall  (2) 2017.10.22
(62/500) NOE.systems - BURYBURY  (0) 2017.10.01

+ Recent posts