LOB xavius → death_knight : remote BOF, rawbf
xavius - throw me away
remote BOF다. 소켓프로그래밍은 오랜만인데, 그래도 코드가 복잡하지는 않다.
서버 프로그램은 서버에서 돌아가는 거니까, 호스트에서 환경변수 등을 사용할 수는 없지만, 256바이트나 사용할 수 있으니까 그냥 버퍼에 집어넣는게 좋겠다.
parent는 while로 계속 돌아가고, child가 recv수행하고 나서 return하므로 child를 사용해 익스플로잇 하게 된다.
근데 recv 직후 close(client_fd) 해서 클라이언트와의 연결이 끊어진다. 따라서 client에 데이터를 전송할 수 없다.
리버스 쉘을 사용하거나, 출력 내용을 저장하도록 해야한다. 리버스 쉘 연결을 대기하도록 쉘코드를 짜기는 귀찮아서 그냥 후자로 진행했다.
쉘코드를 서버 프로그램에 넘기는 방법은 다양하다.
- 직접 클라이언트 프로그램 코딩
- server에 연결한 다음 쉘코드를 보내는 쉘스크립트
- 파이프
3번이 제일 간단하니까 3번을 사용하려고 했는데 netcat이 없다.
다른 os에서 netcat을 사용해도 되겠지만 귀찮아서 telnet을 사용하기로 했다. perl -e 'print "..."' | telnet ...
dumpcode로 확인해보니 data | telnet으로 넘기면 데이터가 안넘어간다. (echo "a"; sleep 1;) | telnet 과 같이 sleep 1;을 넣어줘야 넘어간다. 왜인지는 모르겠다.
또한 telnet을 사용해보니 다음과 같은 문제가 발생한다.
버퍼를 사용하려면 버퍼의 주소인 0xbfff...를 입력해야 하는데, ff가 ff ff가 돼서 버퍼 주소를 입력할 수 없다.
그래서 그냥 raw socket 클라이언트 프로그램을 만들었다.
서버 프로그램의 스택을 가늠할 수 없기 때문에 정확한 버퍼위치를 알 수는 없다. 따라서 만들면서 brute forcing 기능도 넣었다. 사실 server에 데이터를 넘기는 부분은 다른 OS에서 netcat이나 socat으로 처리해도 되기는 하지만 fork - exec 넣자니 맘에 안들어서 그냥 소켓 프로그래밍으로 처리했다.
rawbf.c :
이상한점이, 0x90을 32개 출력하면 되는데 64개 이상 출력하면 안된다. 아마 쉘코드를 실행하면서 esp가 push하는 지점까지 내려가서 쉘코드가 훼손되어 실행이 안되는 것 같다. NOP를 쓸 수록 쉘코드가 아래쪽에 위치하게 되니까.
```bash
[xavius@localhost xavius]$ cat /tmp/xavi
euid = 520
got the life
```
'Security > System Exploit CHAL' 카테고리의 다른 글
FC3 dark_eyes - hell_fire : remoteBOF, GOT overwrite, mprotect (0) | 2017.05.08 |
---|---|
FC3 gate - iron_golem - dark_eyes (0) | 2017.02.03 |
LOB succubus ~ nightmare → xavius : strcpy / stdin과 fgets (0) | 2017.01.28 |
LOB giant ~ zombie_assassin → succubus : ROP (0) | 2017.01.18 |
LOB darkknight ~ bugbear → giant : ldd와 nm으로 함수 mapping 주소 찾기 (0) | 2017.01.16 |