SlideShare a Scribd company logo
1 of 4
Download to read offline
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

What's hot

세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitorjieun kim
 
Linux blue borne-vulnerabilities
Linux blue borne-vulnerabilitiesLinux blue borne-vulnerabilities
Linux blue borne-vulnerabilitiesSeungyong Lee
 
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹GangSeok Lee
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIjieun kim
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractFermat Jade
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Fermat Jade
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programmingihpark92
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom Rhee
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화Jay JH Park
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
Blockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreBlockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreihpark92
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용noerror
 
Block chain introduction slideshare
Block chain introduction   slideshareBlock chain introduction   slideshare
Block chain introduction slidesharewonyong hwang
 
11장 상속
11장 상속11장 상속
11장 상속유석 남
 

What's hot (20)

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

Similar to Sha 2017-teaser-round website attack writeup

[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기찬희 이
 
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것NAVER D2
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명진우 이
 
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석GangSeok Lee
 
learning spark - Chatper8. Tuning and Debugging
learning spark - Chatper8. Tuning and Debugginglearning spark - Chatper8. Tuning and Debugging
learning spark - Chatper8. Tuning and DebuggingMungyu Choi
 
스사모 테크톡 - Apache Flink 둘러보기
스사모 테크톡 - Apache Flink 둘러보기스사모 테크톡 - Apache Flink 둘러보기
스사모 테크톡 - Apache Flink 둘러보기SangWoo Kim
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
Webrtc 허영남 20150528
Webrtc 허영남 20150528Webrtc 허영남 20150528
Webrtc 허영남 20150528영남 허
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4PartPrime
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍OnGameServer
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
19. Application - Spark Streaming 1
19. Application - Spark Streaming 119. Application - Spark Streaming 1
19. Application - Spark Streaming 1merry7
 
2.apache spark 실습
2.apache spark 실습2.apache spark 실습
2.apache spark 실습동현 강
 

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

[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명
 
Tcpdump
TcpdumpTcpdump
Tcpdump
 
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석
 
Race condition
Race conditionRace condition
Race condition
 
learning spark - Chatper8. Tuning and Debugging
learning spark - Chatper8. Tuning and Debugginglearning spark - Chatper8. Tuning and Debugging
learning spark - Chatper8. Tuning and Debugging
 
스사모 테크톡 - Apache Flink 둘러보기
스사모 테크톡 - Apache Flink 둘러보기스사모 테크톡 - Apache Flink 둘러보기
스사모 테크톡 - Apache Flink 둘러보기
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
Perl Script
Perl ScriptPerl Script
Perl Script
 
Webrtc 허영남 20150528
Webrtc 허영남 20150528Webrtc 허영남 20150528
Webrtc 허영남 20150528
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4
 
DB와암호화 패턴
DB와암호화 패턴DB와암호화 패턴
DB와암호화 패턴
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
19. Application - Spark Streaming 1
19. Application - Spark Streaming 119. Application - Spark Streaming 1
19. Application - Spark Streaming 1
 
2.apache spark 실습
2.apache spark 실습2.apache spark 실습
2.apache spark 실습
 

More from Seungyong Lee

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

More from Seungyong Lee (12)

Secure coding-c-dcl-1
Secure coding-c-dcl-1Secure coding-c-dcl-1
Secure coding-c-dcl-1
 
Secure coding-c-preprocessor-3
Secure coding-c-preprocessor-3Secure coding-c-preprocessor-3
Secure coding-c-preprocessor-3
 
Secure coding-c-preprocessor-2
Secure coding-c-preprocessor-2Secure coding-c-preprocessor-2
Secure coding-c-preprocessor-2
 
Secure coding-c-preprocessor-1
Secure coding-c-preprocessor-1Secure coding-c-preprocessor-1
Secure coding-c-preprocessor-1
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
화이트 박스 암호기법
화이트 박스 암호기법화이트 박스 암호기법
화이트 박스 암호기법
 
Dll 하이재킹
Dll 하이재킹Dll 하이재킹
Dll 하이재킹
 
Frida tutorial 1
Frida tutorial 1Frida tutorial 1
Frida tutorial 1
 
C 프로그램 메모리 구조
C 프로그램 메모리 구조C 프로그램 메모리 구조
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