반응형
반응형
스마트 가로등을 관리하는 PC가 공격을 당한 후, 특정 권역에 존재하는 여러 스마트 가로등의 신고 사진을 수집하는 IoT 장치의 DB가 변조 되었다는 신고를 받았다. 변조된 DB 파일에서 아래의 정보를 찾아라.

1. 공격자가 은닉한 범죄를 신고한 시간(YYYY-MM-DD HH:MM:SS UTC+0)
2. 공격자가 삭제한 데이터에서 복구한 파일의 MD5 Hash값(소문자)
3. 공격자가 삭제한 데이터에서 찾아볼 수 있는 문자열

FLAG Format : md5(YYYY-MM-DD HH:MM:SS_복구한이미지의MD5해시값_획득한 문자열)

 

sqlite3 db 파일이 주어진다.

cctv 사진이 담겨있다.

HxD로 열어서 Username을 검색하다 보면

Sharon이라는 DB Browser에서 확인할 수 없었던 이름이 보인다.

이어서 Sharon을 검색해보면 추가적인 데이터들을 더 확인할 수 있다.

삭제된 데이터는 Username=Sharon인 데이터임으로 보여지며, offset을 이용해서 Timestamp와 DOB, Location 값을 뽑아낼 수 있지만, 더 편한 방법도 있다.

 

sqlite는 page 단위로 데이터가 저장되는데, 이 page들을 bring2lite 도구를 사용하여 파싱할 수 있다.

https://github.com/bring2lite/bring2lite

 

GitHub - bring2lite/bring2lite

Contribute to bring2lite/bring2lite development by creating an account on GitHub.

github.com

파싱된 페이지들 중에서 291번을 보면, 삭제된 데이터인 Sharon에 대한 데이터를 확인할 수 있다.

여기서 공격자가 은닉한 범죄를 신고한 시간을 확인할 수 있다.

1489711150 (unix time) = GMT: 2017년 March 17일 Friday AM 12:39:10

 

하지만 이미지 데이터는 확인할 수 없다. 이미지 데이터가 크기 때문에 한 페이지 안에 다 안들어간다.

그래서 leaf 구조로 연결되어 있는데, 이 삭제되어서 free된 page들을 찾아 연결해주어야 전체 데이터를 복구할 수 있다.

 

sqlite page를 볼 수 있는 방법은 sqlite page explorer라는 툴을 사용하는 것이다.

https://github.com/siara-cc/sqlite3_page_explorer

 

GitHub - siara-cc/sqlite3_page_explorer: Cross Platform app to explore internal organisation of tables and indices

Cross Platform app to explore internal organisation of tables and indices - GitHub - siara-cc/sqlite3_page_explorer: Cross Platform app to explore internal organisation of tables and indices

github.com

 

앞서 Sharon에 대한 데이터가 291번 페이지부터 시작하는 것을 알고 있으므로, Open Page에 291을 입력해준다.

오른쪽으로 스크롤 쭉 가면 Overflow칸에 Page 266 버튼이 있다.

266페이지는 first freelist trunk page다.

291 -> 266 ~ 291 페이지까지 순서대로 데이터를 연결하면 된다.

그런데 주의할 점은 각 페이지의 첫 4바이트가 다음 페이지 번호를 나타내기 때문에 해당 4바이트는 빼야 한다.

JPG 파일이므로 ff d9 시그니쳐가 나타날 때까지 데이터를 붙여주면 된다.

266번 페이지도 free 되기 전에는 데이터가 가득 차있었을 페이지인데, first freelist trunk page가 되면서 free된 페이지들의 번호로 덮여쓰여졌다.

똑같이 앞 4바이트를 제외하는 것은 똑같은데 그 외에 덮어쓰여진 데이터는 복구가 불가능하다.

복구된 이미지

c839abe2c76449d472fb8a74e777b38b

 

2017-03-17 00:39:10_c839abe2c76449d472fb8a74e777b38b_d313t3_cr1m3_3v1d3Nc3

반응형

'CTF Write Up' 카테고리의 다른 글

Codegate2023 quals [n³]  (0) 2023.06.26
2023 핵테온 세종 본선 문제 리뷰  (0) 2023.05.12
PwnMe CTF 2023 Write up  (0) 2023.05.06
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
San Diego CTF 2022 Forensics write up  (0) 2022.05.09
반응형

이번 코드게이트 대학부 예선에는 아주대학교 Whois 팀으로 참가했다.

우리 학교의 기말고사 기간이 다른 학교들 보다 조금 늦은 편이라 대회 일정이 시험기간 중간에 끼어버렸다.

시험기간 중에 대회에 참여하다 보니 참여 인원이 적었고, 대부분 온라인으로/극소수의 인원만 오프라인으로 모여 참여하였다.

동아리 지원금으로 큰 공간을 대여해서 팀원들과 밥도 같이 먹으면서 대회하고 싶었는데 아쉬웠다.

 

 


대회 중에 내가 계속 붙잡고 있었던 misc 카테고리의 n3 문제의 공개된 write-up들을 보면서 풀어본 풀이를 작성해 보았다. 

onnx 파일이 주어지는데, onnx 파일은 하나의 딥러닝 모델이다.

https://netron.app/ 에서 시각적으로 구조를 볼 수 있다.

 

input이 1*3*48*768로 설정되어 있는데, 이것은 768 * 48 크기의 하나의 RGB 이미지를 의미한다.

 

다음 If_0_then_branch

각 Conv 레이어는 최대 가중치 1*3*48*256 = 36864를 가진다.

첫번째 Conv 레이어의 Weight는 모두 1로 채워져 있다. 그러나 두번쨰 Conv 레이어의 Weight는 0과 1의 조합으로 채워져 있다.

less than 300  AND less than 32500 AND greater than 32300 조건에 따라서 합은 32400정도가 되어야 하며, 해당 값에 근접할만한 레이어는 두번째 Conv 레이어다. 해당 텐서  값을 다운받아서 시각화할 수 있다.

 

from PIL import Image
import numpy as np

t1 = np.load("t1.npy")
t1_img = (t1 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t1_img, "RGB").save("t1.png")

 

플래그 한 조각을 얻었으므로 다음 If_0_then_branch__If_0_then_branch으로 넘어간다.

(((Input * 255) + Add tensor weight) * 137) %257 (A-A//257*257 나머지 계산임) -> concat(axis = 1) -> conv

 

conv의 텐서를 보면

[

[[[1]],[[0]],[[0]],[[-1]],[[0]],[[0]]],

[[[0]],[[1]],[[0]],[[0]],[[-1]],[[0]]],

[[[0]],[[0]],[[1]],[[0]],[[0]],[[-1]]]

]

첫번째 conv은 채널 0과 3 사이의 차이를 계산

두번째 conv는 채널 1과 4 사이의 차이를 계산

세번째 conv는 채널 2와 5 사이의 차이를 계산

각 차이의 합의 제곱이 작아야 하는데, concat(axis=1)처리된 것에 따라서 채널 0부터2는 concat 레이어의 input값이었고

채널 3부터 5는 concat의 weight 텐서값이었으므로, input값과 concat의 weight 텐서값이 같을 것이라고 보고 최초 input을 찾기 위해 역연산을 진행한다.

A * 137 = C (mod 257) 역원 구하기 -> pow(137,-1,257) => 242

 

from PIL import Image
import numpy as np

tc2 = np.load("tc2.npy")
ta2 = np.load("ta2.npy")

t2 = ((tc2 * 242 - ta2) % 257) / 255
t2_img = (t2 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t2_img, "RGB").save("t2.png")

 

다음 If_0_then_branch__If_0_then_branch__If_0_then_branch

는 다음에 이어서...

https://party4bread.github.io/writeupfyi.html

 

마지막 조각 If_0_then_branch__If_0_then_branch__If_0_then_branch__If_0_then_branch

Input * 2 -1 -분할-> [,,,0:256] * [,,,256:512] * [,,,512:768] * Mul() <= 0

 

반응형
반응형

말 많았던 핵테온 세종

https://www.dailysecu.com/news/articleView.html?idxno=145171 

 

[단독] 핵테온 세종, CCE 문제 그대로 출제해 해킹대회 공정성 훼손...문제 출제 예산 ‘0

세종특별자치시(시장 최민호)가 지난 3월 25일 개최한 ‘2023 핵테온 세종(HackTheon Sejong) 국제 대학생 사이버보안 경진대회’ 예선전 문제가 참가자들 사이에서 CCE 문제를 그대로 베껴 출제했다는

www.dailysecu.com

대회 운영, 문제 퀄리티, 게싱 문제 논란 등 예선이랑 달라진 것이 없다.

참가자 숙소가 카라반인거, 식사 제공, 늦은 대회 안내 등의 문제도 있고

디스코드 채널은 만들고 대회 끝나면 싹 닫아버리고

외국 참가자들도 있는데 본선 일정 중 공지와 qna는 카카오톡 오픈 챗방?

오픈 챗방도 행사 종료됐다며 바로 닫아버렸다.

https://www.boannews.com/media/view.asp?idx=116956 

 

핵테온 세종 2023, 명색이 국제해킹대회인데... 예선 이어 본선도 공정성 ‘논란’

세종시가 주최한 국제 대학생 사이버보안 경진대회 ‘2023 HackTheon Sejong’(핵테온 세종 2023, 이하 핵테온)을 두고 참가자들 사이에서 논란이 확산되고 있다. 예선에서는 지난해 개최된 2022 사이버

www.boannews.com

 

https://www.dailysecu.com/news/articleView.html?idxno=146065 

 

[이슈진단] 상처만 남은 세종시 주최 ‘핵테온 세종 2023’...해커를 대하는 생각부터 바뀌

세종시(시장 최민호)에서 주최한 국제 대학생 사이버보안 경진대회 ‘핵테온 세종 2023(HackTheon Sejong)’ 본선이 지난 5월 11일~12일 정부세종컨벤션센터에서 개최됐다. 데일리시큐는 핵테온 세종 20

www.dailysecu.com


일단 포렌식이랑 Misc 두 문제를 보자.

일단 Misc

문제 설명은 Find a key가 다다.

Travel 파일이 주어지는데, 압축파일이다.

.zip을 붙여서 열어보면 ms office word 파일임을 알 수 있다.

Final 폴더 내의 파일들을 압축을 풀어내고 다시 압축을 해서 .doc로 파일명을 바꾸면 열 수 있다.

 

문서의 내용은 이게 전부다. 글자는 기본 하얀색으로 되어 있어서 빨간색으로 바꾸어주었다.

뒤에 연결된 이미지를 표시할 수 없다는 내용은 해당 이미지가 rId4 -> media/image1.png 를 참조하는데, media/image1.jpg는 있지만 image1.png는 없기 때문이다.

media 폴더에 이미지 파일이 많이 있다.

Sejong Tour Plan!!.png 이미지를 보면 4곳의 스탬프를 모아서 플래그를 찾으라는 것으로 보인다.

binwalk 명령어를 사용해서 Sejong Tour Plan!!.png 이미지에 표시된 이미지에 해당되는 파일 image2.png, image5.jpg, image7.jpg, image9.jpg에서 end시그니쳐 뒤에 붙어있는 다른 이미지 파일을 분리해낼 수 있다.

이를 방법을 통해 Stamp 이미지 4개를 찾을 수 있으며, 각 스탬프 이미지에 문자열이 있는데, 4개를 이어서 base64 디코딩을 하면

you_are_a_white_hacker

가 된다.

 

그리고 깃발 그림이 있는 image12.jpg에서 zip파일을 분리해낼 수 있으며 안에 flag.txt가 있으나 암호가 걸려 있다.

 

그리고 image8.jpg는 실제론 docx 파일이며, 열었을 때 XOR KEY라는 값을 얻을 수 있다.

해당 hex 값을 ascii로 바꾸면

this_is_xor_key_value_

가 된다.

 

value하고 _로 끝나는 걸 봐서는 두개를 합쳐 this_is_xor_key_value_you_are_a_white_hacker 를 만들고 이거랑 xor 할 값을 넣어야 할 거 같은 느낌이 드는데,

XOR_Key 로 준 hex값과 스탬프를 모아서 만든 you_are_a_white_hacker의 hex 값 0x796F755F6172655F615F77686974655F6861636B6572을 서로 xor 해서 나온 결과 값 0xd071c2c3e1b16001930053702111c001e000f1e002d을 10진수로 변환한 값이 zip파일의 패스워드다.

그렇게 zip파일 암호를 풀어서 flag.txt을 얻을 수 있다.

 

일단 플래그를 3~4 등분을 내서 xor을 하고 파일 이곳 저곳에 숨겨 놓는건 예선에서 나왔던 문제랑 다를 게 없다.

그리고 찾아낸 값들은 다 ascii 범위의 값을 주고서는 정작 zip 파일의 패스워드를 구하는 건 ascii 범위를 벗어나는 값.. 최소한 zip 패스워드처럼 생기도록 만들었어야 하는거 아닌가

0xd071c2c3e1b16001930053702111c001e000f1e002d -> ÐqÂÃá±`“Sp!Ààñàd

아니 10진수로 입력해야하는 것에도 아무런 근거가 없다. 정작 XOR_Key 값은 정확하게 Hex 형태로 줬다. 스탬프에는 base64로 주고서는, ascii도 hex도 base64도 아니고 10진수?


다음은 포렌식 문제

문제 설명이 아마 두 명이 서로 비밀 메세지를 교환했다는 거였던걸로 기억하는데

문제 설명만 보고 이번 본선에서도 예선처럼 더러운 패킷 문제를 냈구나라고 생각했었다.

근데 이번엔 rar 파일과 pdf 파일이 주어졌다. (근데 또 문제설명은 문제와 아무런 연관이 없다.)

처음에는 확장자가 없다. 직접 식별해서 붙여줘야 한다.

rar 파일에는 암호가 걸려있다. 그 암호를 se.pdf에서 찾아야 하는 것으로 보여진다.

/JS 에 하나

JS object에서 링크 하나를 얻을 수 있고

Annotation object도 있는데

맨 앞 값 순서대로 문자열을 배치하면 w24<P%96o~?R}_S`T 가 되고, 이를 ROT47을 돌리면 Hack!The@On#N0$1%가 된다.

왜 Annotation에 저런 값이 있는가? -> 그냥 숨겨놓은 위치

왜 ROT47인가? -> 앞에 ROT라고 키워드를 줬으니까..? "그냥"

그리고 압축을 푼 파일에 또 확장자 없는 파일이 하나 있는데 오디오 파일이다.

해당 파일의 오디오 스펙트럼에서 hex 값을 확인할 수 있다.

Sonic Visualiser

해당 hex값과 처음 JS object에서 얻은 링크에 있는 이미지 속의 25와 xor을 하면 플래그가 나온다.

아, 10진수 25가 아니라 16진수 0x25다. 왜? -> "그냥"

뜬금없이 JS에 이런 링크가 있는 것도 의문이었는데, 저 이미지 속에 25를 찾아서 xor을 해야 하고 xor 할때 0x25로 해야한다니

이게 포렌식인가..

 

반응형

'CTF Write Up' 카테고리의 다른 글

사이버보안챌린지 2023 문제풀이 manipulation  (0) 2023.09.20
Codegate2023 quals [n³]  (0) 2023.06.26
PwnMe CTF 2023 Write up  (0) 2023.05.06
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
San Diego CTF 2022 Forensics write up  (0) 2022.05.09

+ Recent posts