본문 바로가기

3. Pwnable (포너블)/2) 개념 정리

[2021.11.13] OverTheWire 11-20, 달고나문서 -p.17

Over The Wire

Bandit Level 10 → Level 11

힌트: 다음 단계의 패스워드는 data.txt라는 파일에 저장되어 있으며, base 64로 암호화된 data를 가지고 있다.
1. ls 입력 후 파일 존재 확인
2. cat 파일명 입력 후 파일 내용 확인
3. base64로 암호화되어있는 파일을 base64로 decode 시켜줘서 파일 내용 확인

Bandit Level 11 → Level 12

힌트: 다음 단계의 패스워드는 data.txt라는 파일에 저장되어 있으며, 모든 대소문자 글자는 알파벳 순 13번 째 뒤 자리 글자로 교체되어있다.
1. ls 입력 후 파일 존재 확인
2. cat 파일명 입력 후 파일 내용 확인
3. tr 을 통해 파일 내용 확인
<tr>
tr + ‘문자열 1’ + ‘문자열 2’ = 문자열1을 문자열2로 변경
ex) tr ‘a-g’ ‘A-G’ = 소문자를 대문자로 변경

Bandit Level 12 → Level 13

힌트: 다음 단계의 패스워드는 data.txt라는 파일에 저장되어있는데, 반복적으로 압축되어있는 헥스덤프의 파일이다. 여기서 mkdir을 사용하여 작업할 수 있는 /tmp 아래에서 directory를 만드는게 유용할 것이다. 그리고 나서 cp를 사용하고 mv를 이용해서 이름을 바꾸는 방식 역시 유용할 것이다
1. ls 입력해 data.txt의 존재를 확인한 뒤 cat으로 내용을 확인하다.

2. 출력하면 힌트에서 말했던 것 처럼 헥스덤프(16진수 덤프파일)로 이루어져있다.


3. /tmp 아래에 임의의 디렉토리 형성 후 그 안으로 이동해서 data.txt 을 옮겨준다.
4. xxd -r로 16진수를 2진수로 바꾼 뒤 임의의 다른 파일로 redirection해준다.
5. file (임의의 다른 파일)로 이 파일의 형식을 확인해준다.
6. gzip으로 압축되어 있기에 gzip -d (파일명).(파일형식) 압축을 풀어준다
7. 다시 file로 확인해보면 bzip2로 압축되어 있기에 또 풀어준다.
8.계속 압축을 풀어주다보면 원본 파일의 마지막 해체 파일을 한다.
9. cat 마지막 파일.(파일형식) 해서 패스워드 확인

Bandit Level 13 → Level 14

힌트: 다음 단계의 패스워드는 /etc/bandit_pass/bandit14에 저장되어있고 bandit14 유저로 접속했을 때만 읽을 수 있다. 다음 단계로 로그인 할 때 사용할 수 있는 SSH key를 얻을 수 있다.
1. ls 입력 후 파일 존재 확인
2. SSH private key가 있을 파일 존재 확인
3. ssh -i 를 통해 유저 bandit14 로 로그인
<ssh -i>
-i : using an identity file

4. bandit14로 로그인 한 후 패스워드가 있다는 곳으로 이동
5. ls로 파일 존재 확인
6. bandit14 파일을 cat으로 열어 내용 확인

Bandit Level 14 → Level 15

힌트: 다음 단계의 패스워드는 localhost에서 포트 30000로 현재 단계의 패스워드를 보내면 받을 수 있다.
1. nc localhost를 이용해 포트 30000에 연결
2. bandit14의 패스워드 입력

Bandit Level 15 → Level 16

힌트: 다음 단계의 패스워드는 localhost에서 SSL 암호화를 사용중인 포트 300001로 현재 단계의 패스워드를 보내면 받을 수 있다.
1. bandit15와 같은 방식으로 접속하니 연결을 거부
2. openssl s_client 를 이용해 접속
<s_client>
openssl s_client -connect + host:port
ex) openssl s_client -connect localhost:4433 : localhost로 4433라는 포트에 접속

3. 현재 단계의 패스워드 입력

Bandit Level 16 → Level 17

힌트:다음 단계의 권한은 310000 ~320000 사이 local host로 접속한 포트에 현재 단계의 패스워드를 전달하면 받을 수 있다. 먼저 어떤 포트가 열려있는지 확인하고 이 중 SSL을 사용하는 포트를 알아낸다. 이 중 한 서버만이 다음 단계의 권한을 부여해준다.
1. nmap 명령어를 입력하면 열려있는 서버 5개가 잡힌다.

2. 각 포트들에 nc 명령어로 간단한 메세지를 보내는데 31790, 31581은 echo back하지 않으니, SSL을 사용하고 있다.

3. openssl s_client -connect [호스트]:[포트번호]로 31790를 입력하면 현재 단계의 패스워드를 입력해주면 RSA key를 출력해준다.

4. mkdir -p /tmp/RSA로 key를 복사해준 뒤 저장한뒤 bandit17.key로 이름을 저장해준 뒤 chmod 600 bandit17.key로 파일 권한을 변경한다

5. ssh -i bandit17.key bandit17@localhost 로 이제 bandit17에 로그인 해서 패스워드를 확인한다
<nmap>
nmap + -p + <port range> : 점검하고자 하는 포트를 지정
ex)namp -p 20-30 : 20에서 30 사이 포트에 대해 스캔하라

Bandit Level 17 → Level 18

힌트: homedirectory에는 passwords.old과 passwords.new라는 2개의 파일이 있다. 다음 단계의 패스워드는 password.new에 있고 위 두 파일 사이 변경된유일한 라인이다.
1. ls로 두 파일 존재 확인
2. diff로 두 파일 사이 차이점을 추출

Bandit Level 19 → Level 20

힌트: 다음 단계의 접근 권한을 얻으려면 homedirectory에서 setuid binary를 사용해야한다. setuid binary를 실행해서 /etc/bandit_pass/에서 다음 단계의 비밀 번호를 얻을 수 있다.
1. ls로 binary 파일 존재 확인
2. 위 binary 파일을 실행해야하기에 ./bandit20-do라는 명령어 사용
3. 다음 단계에 대한 패스워드가 /etc/bandit_pass/에 있으니깐 cat으로 bandit20에 있는 내용 확인


달고나 문서 (p.12 - p.18)

프로그램 구동 시 segment에서는 어떤 일이? - simple.c


C언어로 작성한 프로그램을 assembly code로 변환하기 위한 컴파일 코드
: gcc -S -o (이름).asm (프로그램1).c
(프로그램1).c 이 컴파일 되어 실제 메모리 상에 존재하게 되는 위치
: gdb (이름) -> disas main

앞에 붙어 있는 주소가 logical address다.
function() 함수가 아래에 자리 잡고 main()함수가 위에 자리 잡고 있다.
segment 크기는 프로그램마다 다르다.
프로그램이 시작되면 main()함수의 시작점인 0x80482fc을 가리키고 있다.