SHA-2017 Teaser-Round Network
Website Attack write up
문제 풀이를 위한 pcap파일이 주어진다.
PCAP 은 Packet Capture 의미로 네트워크 트래픽을 캡쳐하기 위한
API 로 구성이 되어 있다. 윈도우로 포팅되어 있는 것은 WinPcap 이며, 유닉스 환경에서는 libpcap 이다. libpcap 과
winpcap 라이브러리를 이용하여 캡쳐된 패킷을 파일로 저장하거나, 저장된 패킷을 읽고 또는 다른 프로그램에서 라
이브러리를 이용해 패킷파일을 분석/편집 등을 할 수 있다. 이를 이용한 대표적인 패킷 캡쳐 프로그램이 tcpdump 나
wireshark 이다.
출처 : 패킷인사이드
와이어 샤크를 이용하여 pcap을 열어보면 TCP, IPA 패킷이 저장되어 있는 것을 확인할 수 있다. IPA 패킷 내용을 확인해보면
HTTP 패킷으로 보이므로 분석의 용이성을 위해서 HTTP 패킷으로 변환하여 분석하도록 한다.
Wireshark -> Analyze -> Enabled Protocol -> GSM over IP 체크 해제
참고 URL
Data which has been sent over TCPIP has been recognized by wireshark as “IPA” Protocol
[Malformed Packet: GSM over IP]
패킷의 흐름을 살펴보면 다음과 같다.
여기서 word의 값만 변경되는 데 총 3개의 word를 요청한다.
kl
Trad
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
각각의 word 값을 암호화된 값에 짝지어보면 다음과 같다.
237
237
208
208
GET /?action=search&word=&sort=stock
Encrypt/Encoding
302 Found
GET /?action=display&what=[encrypt string]
kl : ce3926706794d911
Trad : f1274d671988ce151a0b
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA :
e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032e4146d4252bafb3b38212df1
86497a7479d5e95af4796e7573a65e6849952032e4146d4252bafb3b38212df186497a7479d5e95af4796e75
73a65e6849952032e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032e4146d42
52bafb3b38212df186497a74799edb6fda5b44
여기서 문자열 수에 관련된 한 가지 규칙을 찾을 수 있다.
평문 평문 문자열 수 암호화한 문자열 수 문자열 수 방정식
kl 2 16 16 = 2x + y
Trad 4 20 20 = 4x + y
A*146 146 302 302 = 146x + y
암호화 키 재사용 시 평문 문자열로 복호화가 가능한 취약점이 있는 RC4 평문공격을 시도해보자.
RC4 알고리즘은 암호화 키를 이용하여 긴 바이트 문자열(키 스트림)을 생성한 후 긴 바이트 문자열(키 스트림)을 이용하여 일
반 텍스트와 함께 암호문을 생성한다.
만약 우리가 다른 평문 문자열과 암호화한 문자열을 알고 있고 암호화 키가 동일하다면 다음과 같이 식을 세울 수 있다.
두 식을 합치면 다음과 같은 결론을 얻을 수 있다.
RC4 , Is it possible to find the key if we know the plaintext and ciphertext?
POC
targetCipher = "af7d6f4240be9a2d31252290ef5b7e797dd7fc3be66d6d6766b5375a79b84d42"
sourceCipher= "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032"
plainText = "4141414141414141414141414141414141414141414141414141414141414141"
result = ""
for i in range(len(targetCipher) / 2):
aa = ord(targetCipher[i*2:i*2 + 2].decode('hex'))
bb = ord(sourceCipher[i*2:i*2 + 2].decode('hex'))
cc = ord(plainText[i*2:i*2 + 2].decode('hex'))
result = result + chr(aa ^ bb ^ cc)
print result
cipher = 2 ∗ plain + 12
= ⊕ RC (key)Ci Pi 4i
= ⊕ RC (key)C′
i
P′
i
4i
= ⊕ ⊕Pi P′
i
Ci C′
i
파이썬 코드를 실행해보면 (CASE WHEN (SELECT SUBSTR(sql,1 이 출력되는 것을 확인할 수 있다.
동일한 방법으로 다른 암호문을 복호화 해보자. Wireshark의 Export Object -> HTTP 기능을 사용하면 HTTP 패킷만 따
로 저장할 수 있다. 해당 기능을 이용하여 패킷을 저장한 후 파이썬 스크립트를 수행하자.
from os import listdir
fileNames = listdir("/Users/seungyonglee/ctf/sha_2017/HTTP")
for fileName in fileNames:
cipherString = fileName[23:]
result = ""
for I in range(len(cipherString) / 64 + 1):
a = cipherString[I*64:(I+1)*64]
b = "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032"
c = "4141414141414141414141414141414141414141414141414141414141414141"
for i in range(len(a) / 2):
aa = ord(a[i*2:i*2 + 2].decode('hex'))
bb = ord(b[i*2:i*2 + 2].decode('hex'))
cc = ord(c[i*2:i*2 + 2].decode('hex'))
result = result + chr(aa ^ bb ^ cc)
print result
실행 결과 다음과 같이 Blind SQL Injection 수행 문자열을 확인할 수 있다.
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘{’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘z’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘y’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘x’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘s’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘r’ THEN stock ELSE price END
(CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘q’ THEN stock ELSE price END
…
공격에 성공한 값만 보기 위해서 스크립트를 수정하자.
from os import listdir
fileNames = listdir('/Users/seungyonglee/ctf/sha_2017/HTTP')
# Decrypt routine, without changes
def decrypt(z):
result = ""
for I in range(len(z) / 64 + 1):
a = z[I*64:(I+1)*64]
b = "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032"
c = "4141414141414141414141414141414141414141414141414141414141414141"
for i in range(len(a) / 2):
aa = ord(a[i*2:i*2 + 2].decode('hex'))
bb = ord(b[i*2:i*2 + 2].decode('hex'))
cc = ord(c[i*2:i*2 + 2].decode('hex'))
result = result + chr(aa ^ bb ^ cc)
return result
# A flag placeholder (string is immutable :/ )
flag = [' ' for _ in range(40)]
# For all files
for fileName in fileNames:
f = open('/Users/seungyonglee/ctf/sha_2017/HTTP/' + fileName, 'r')
fc = f.read()
# If it's a hit (the ordering of products is different)
if fc.find('hyper') < fc.find('Traditional'):
# fileName[23:] == Get only the ciphertext from filename
r = decrypt(fileName[23:])
# If the SQLi attempt targeted flag (not the SQL schema!)
if r.find('flag') != -1:
chi = r.find("'") + 1
if chi != 0:
ch = r[chi]
indi = r.find(',') + 1
if indi != 0:
ind = r[indi:indi+2]
if ind[1] == ',':
ind = ind[0]
if chi != 0:
print ind, ch
flag[int(ind)] = ch
print ''.join(flag)
flag가 출력되는 것을 확인할 수 있다.
flag{7307e3ee8da198ca4a7f9b1f8b018d8e}
출처: Website Attack (Network).md

More Related Content

PDF
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
PDF
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
PDF
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
PDF
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
PDF
[OpenTRS-001] Hotel California
PDF
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
PDF
Learning Node Book, Chapter 5
PDF
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[OpenTRS-001] Hotel California
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
Learning Node Book, Chapter 5
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현

What's hot (20)

PDF
세션5. web3.js와 Node.js 를 사용한 dApp 개발
PDF
Ryu with OpenFlow 1.3, Traffic Monitor
PDF
Linux blue borne-vulnerabilities
PDF
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
PPTX
Startup JavaScript 8 - NPM, Express.JS
PDF
Ryu with OpenFlow 1.3, REST API
PDF
Blockchain Study(4) - Geth & Smart Contract
PDF
Blockchain Study(5) - Smart Contract(스마트 계약)
PDF
Blockchain 4th dapp programming
PDF
사내스터디 발표 온라인게임서버이해 20100401
PPTX
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
PDF
세션3. geth 클라이언트 실습 및 모니터링과 시각화
PDF
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
PPTX
이더리움의 현황, 한계점 및 개선노력
PPTX
골때리는 자바스크립트 발표자료
PPTX
tcp ip study
PDF
Blockchain 1st bitcoin_core
PPTX
11_웹서비스활용
PPTX
Block chain introduction slideshare
PPTX
11장 상속
세션5. web3.js와 Node.js 를 사용한 dApp 개발
Ryu with OpenFlow 1.3, Traffic Monitor
Linux blue borne-vulnerabilities
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
Startup JavaScript 8 - NPM, Express.JS
Ryu with OpenFlow 1.3, REST API
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain 4th dapp programming
사내스터디 발표 온라인게임서버이해 20100401
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
세션3. geth 클라이언트 실습 및 모니터링과 시각화
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
이더리움의 현황, 한계점 및 개선노력
골때리는 자바스크립트 발표자료
tcp ip study
Blockchain 1st bitcoin_core
11_웹서비스활용
Block chain introduction slideshare
11장 상속
Ad

Similar to Sha 2017-teaser-round website attack writeup (20)

PPTX
2016 hack festival igrus
PDF
[무료] 시스템해킹(해커스쿨문제풀이) 공개버전
PPTX
암호화 이것만 알면 된다.
PDF
해커스쿨 FTZ 문제 풀이
PPTX
파이썬 언어 기초
PDF
Light Tutorial Python
PPTX
Programming challange crypt_kicker
PPTX
Pwnable study basic_1
 
PPTX
해시암호와 비밀번호 - 9th KUSISWALL
PDF
Hackerschool FTZ 문제 풀이
PPTX
빠르게 활용하는 파이썬3 스터디(ch1~4)
PDF
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 컴퓨터 보안 과제물 제출본
PPTX
Web vulnerability seminar2
PDF
Hash algorithm
PPTX
공인인증서 크래킹 - Inc0gnito 2015
PDF
Codegate 2013 Junior - Music Player Exploit
PDF
파이썬 데이터 분석 (18년)
PPTX
문과생 대상 파이썬을 활용한 데이터 분석 강의
PDF
Ddos조사
PPTX
파이썬 파일처리 이해하기
2016 hack festival igrus
[무료] 시스템해킹(해커스쿨문제풀이) 공개버전
암호화 이것만 알면 된다.
해커스쿨 FTZ 문제 풀이
파이썬 언어 기초
Light Tutorial Python
Programming challange crypt_kicker
Pwnable study basic_1
 
해시암호와 비밀번호 - 9th KUSISWALL
Hackerschool FTZ 문제 풀이
빠르게 활용하는 파이썬3 스터디(ch1~4)
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 컴퓨터 보안 과제물 제출본
Web vulnerability seminar2
Hash algorithm
공인인증서 크래킹 - Inc0gnito 2015
Codegate 2013 Junior - Music Player Exploit
파이썬 데이터 분석 (18년)
문과생 대상 파이썬을 활용한 데이터 분석 강의
Ddos조사
파이썬 파일처리 이해하기
Ad

More from Seungyong Lee (12)

PDF
Secure coding-c-dcl-1
PDF
Secure coding-c-preprocessor-3
PDF
Secure coding-c-preprocessor-2
PDF
Secure coding-c-preprocessor-1
PDF
윈도우 커널 익스플로잇
PDF
화이트 박스 암호기법
PDF
Dll 하이재킹
PDF
Frida tutorial 1
PDF
C 프로그램 메모리 구조
PDF
리눅스 커널 기초 태스크관리
PDF
암호 기법의 소개
PDF
문자열이란 무엇인가
Secure coding-c-dcl-1
Secure coding-c-preprocessor-3
Secure coding-c-preprocessor-2
Secure coding-c-preprocessor-1
윈도우 커널 익스플로잇
화이트 박스 암호기법
Dll 하이재킹
Frida tutorial 1
C 프로그램 메모리 구조
리눅스 커널 기초 태스크관리
암호 기법의 소개
문자열이란 무엇인가

Sha 2017-teaser-round website attack writeup

  • 1. SHA-2017 Teaser-Round Network Website Attack write up 문제 풀이를 위한 pcap파일이 주어진다. PCAP 은 Packet Capture 의미로 네트워크 트래픽을 캡쳐하기 위한 API 로 구성이 되어 있다. 윈도우로 포팅되어 있는 것은 WinPcap 이며, 유닉스 환경에서는 libpcap 이다. libpcap 과 winpcap 라이브러리를 이용하여 캡쳐된 패킷을 파일로 저장하거나, 저장된 패킷을 읽고 또는 다른 프로그램에서 라 이브러리를 이용해 패킷파일을 분석/편집 등을 할 수 있다. 이를 이용한 대표적인 패킷 캡쳐 프로그램이 tcpdump 나 wireshark 이다. 출처 : 패킷인사이드 와이어 샤크를 이용하여 pcap을 열어보면 TCP, IPA 패킷이 저장되어 있는 것을 확인할 수 있다. IPA 패킷 내용을 확인해보면 HTTP 패킷으로 보이므로 분석의 용이성을 위해서 HTTP 패킷으로 변환하여 분석하도록 한다. Wireshark -> Analyze -> Enabled Protocol -> GSM over IP 체크 해제 참고 URL Data which has been sent over TCPIP has been recognized by wireshark as “IPA” Protocol [Malformed Packet: GSM over IP] 패킷의 흐름을 살펴보면 다음과 같다. 여기서 word의 값만 변경되는 데 총 3개의 word를 요청한다. kl Trad AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 각각의 word 값을 암호화된 값에 짝지어보면 다음과 같다. 237 237 208 208 GET /?action=search&word=&sort=stock Encrypt/Encoding 302 Found GET /?action=display&what=[encrypt string]
  • 2. kl : ce3926706794d911 Trad : f1274d671988ce151a0b AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA : e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032e4146d4252bafb3b38212df1 86497a7479d5e95af4796e7573a65e6849952032e4146d4252bafb3b38212df186497a7479d5e95af4796e75 73a65e6849952032e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032e4146d42 52bafb3b38212df186497a74799edb6fda5b44 여기서 문자열 수에 관련된 한 가지 규칙을 찾을 수 있다. 평문 평문 문자열 수 암호화한 문자열 수 문자열 수 방정식 kl 2 16 16 = 2x + y Trad 4 20 20 = 4x + y A*146 146 302 302 = 146x + y 암호화 키 재사용 시 평문 문자열로 복호화가 가능한 취약점이 있는 RC4 평문공격을 시도해보자. RC4 알고리즘은 암호화 키를 이용하여 긴 바이트 문자열(키 스트림)을 생성한 후 긴 바이트 문자열(키 스트림)을 이용하여 일 반 텍스트와 함께 암호문을 생성한다. 만약 우리가 다른 평문 문자열과 암호화한 문자열을 알고 있고 암호화 키가 동일하다면 다음과 같이 식을 세울 수 있다. 두 식을 합치면 다음과 같은 결론을 얻을 수 있다. RC4 , Is it possible to find the key if we know the plaintext and ciphertext? POC targetCipher = "af7d6f4240be9a2d31252290ef5b7e797dd7fc3be66d6d6766b5375a79b84d42" sourceCipher= "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032" plainText = "4141414141414141414141414141414141414141414141414141414141414141" result = "" for i in range(len(targetCipher) / 2): aa = ord(targetCipher[i*2:i*2 + 2].decode('hex')) bb = ord(sourceCipher[i*2:i*2 + 2].decode('hex')) cc = ord(plainText[i*2:i*2 + 2].decode('hex')) result = result + chr(aa ^ bb ^ cc) print result cipher = 2 ∗ plain + 12 = ⊕ RC (key)Ci Pi 4i = ⊕ RC (key)C′ i P′ i 4i = ⊕ ⊕Pi P′ i Ci C′ i
  • 3. 파이썬 코드를 실행해보면 (CASE WHEN (SELECT SUBSTR(sql,1 이 출력되는 것을 확인할 수 있다. 동일한 방법으로 다른 암호문을 복호화 해보자. Wireshark의 Export Object -> HTTP 기능을 사용하면 HTTP 패킷만 따 로 저장할 수 있다. 해당 기능을 이용하여 패킷을 저장한 후 파이썬 스크립트를 수행하자. from os import listdir fileNames = listdir("/Users/seungyonglee/ctf/sha_2017/HTTP") for fileName in fileNames: cipherString = fileName[23:] result = "" for I in range(len(cipherString) / 64 + 1): a = cipherString[I*64:(I+1)*64] b = "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032" c = "4141414141414141414141414141414141414141414141414141414141414141" for i in range(len(a) / 2): aa = ord(a[i*2:i*2 + 2].decode('hex')) bb = ord(b[i*2:i*2 + 2].decode('hex')) cc = ord(c[i*2:i*2 + 2].decode('hex')) result = result + chr(aa ^ bb ^ cc) print result 실행 결과 다음과 같이 Blind SQL Injection 수행 문자열을 확인할 수 있다. (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘{’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘z’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘y’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘x’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘s’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘r’ THEN stock ELSE price END (CASE WHEN (SELECT SUBSTR(flag,5,1) FROM secret_flag LIMIT 0,1) = ‘q’ THEN stock ELSE price END … 공격에 성공한 값만 보기 위해서 스크립트를 수정하자. from os import listdir fileNames = listdir('/Users/seungyonglee/ctf/sha_2017/HTTP') # Decrypt routine, without changes def decrypt(z): result = "" for I in range(len(z) / 64 + 1): a = z[I*64:(I+1)*64] b = "e4146d4252bafb3b38212df186497a7479d5e95af4796e7573a65e6849952032" c = "4141414141414141414141414141414141414141414141414141414141414141" for i in range(len(a) / 2): aa = ord(a[i*2:i*2 + 2].decode('hex')) bb = ord(b[i*2:i*2 + 2].decode('hex')) cc = ord(c[i*2:i*2 + 2].decode('hex')) result = result + chr(aa ^ bb ^ cc) return result
  • 4. # A flag placeholder (string is immutable :/ ) flag = [' ' for _ in range(40)] # For all files for fileName in fileNames: f = open('/Users/seungyonglee/ctf/sha_2017/HTTP/' + fileName, 'r') fc = f.read() # If it's a hit (the ordering of products is different) if fc.find('hyper') < fc.find('Traditional'): # fileName[23:] == Get only the ciphertext from filename r = decrypt(fileName[23:]) # If the SQLi attempt targeted flag (not the SQL schema!) if r.find('flag') != -1: chi = r.find("'") + 1 if chi != 0: ch = r[chi] indi = r.find(',') + 1 if indi != 0: ind = r[indi:indi+2] if ind[1] == ',': ind = ind[0] if chi != 0: print ind, ch flag[int(ind)] = ch print ''.join(flag) flag가 출력되는 것을 확인할 수 있다. flag{7307e3ee8da198ca4a7f9b1f8b018d8e} 출처: Website Attack (Network).md