Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 메타스플로잇
- SQLINJECTION
- load of sqlinjection
- 취약점분석
- 스캔
- 해킹툴
- 암호해독
- 권한상승
- Samba
- 스캐닝
- 취약점 스캔
- 침투테스트
- 해킹
- 포트스캔
- 해킹도구
- root권한
- smb
- 내부침투
- 시스템 해킹
- SQL Injection
- 취약점
- sql
- web hacking
- Kioptrix
- Metasploit
- Hacking
- Los
- 칼리리눅스
- CTF
- 모의해킹
Archives
- Today
- Total
감자 텃밭
Pwntools 사용법 본문
포너블(시스템 해킹)을 하면서
많은 기능을 제공해주는 Pwntools는 엄청 많은 도움이 되며, 정말 Exploit에 큰 도움이 된다.
pip를 통해 설치후에
Exploit 파일인 .py 내에서 사용이 가능하며, 불러오기 위해
제일 상단에
from pwn import * 로 해당 모듈을 불러올 수 있다.
from pwn import *
1.연결
1. 원격 접속 - 공격서버에 공격을하기위해 원격으로 붙기위해 사용 (nc)
remote("ip",port)
ex) r = remote("192.168.10.101", 8080)
2. 로컬 접속 - 공격서버에 원격으로 붙기전에 로컬에서 우선 Exploit코드를 실행시켜보기 위해 사용
process("파일")
ex) p = process("./test")
3. ssh 접속 - ssh접속을 할때 사용
ssh(username, ip, port, password)
ex) s = ssh("test", "192.168.1.101", port=8080, password="pswd")
2. 문자열, 데이터 받아오기
1. recv(int) - int형으로 문자열을 받아올 때 사용, 보통 서버에서 주소값을 던져줄때 받기위해 사용
ex) int(r.recv(10),16) - 출력되는 문자열을 int형으로 10바이트를 16진수로 받아온다.
2. recvline() - 출력되는 문자열 한 줄을 받아온다.
ex) a = r.recvine()
3. recvuntil("string") - 출력되는 문자열중 원하는 위치까지 받아온다.
ex) r.recvuntil("input : ") - 이와같이 사용 후 전송을 할 수 있으며,
ex2) r.recvuntil("output : ")
r.recv(1024) 와 같이 한쌍으로 사용할 수 있음.
3. 데이터 및 문자열 전송
1. send(value) - 데이터 전송
ex) r.send(value)
2. sendline(value) - 데이터를 한줄로 전송 \n(개행)이 마지막에 추가됨
ex) r.sendline(value)
3. sendlineafter("string",value) - 특정 문자열까지 받은 후 데이터 전송
ex) r.sendlineafter("intput : ",payload)
4. Packing
1. p32(value) - 값을 32bit 리틀엔디안 방식으로 packing
ex)p32(0x138a56fd) - 0xfd568a13
2. p64(value) - 값을 64bit 리틀엔디안 방식으로 packing
ex)p64(0x138a56fd) - 0xfd568a13
5. Unpacking
1. u32(string) - 값을 32bit 리틀엔디안 방식으로 unpacking
ex) u32(0x138a56fd)
2. u64(string) - 값을 64bit 리틀엔디안 방식으로 unpacking
ex) u64(0x138a56fd)
6. 쉘 획득 후 쉘 유지 및 상호작용
1. interactive()
ex) r.interactive()
- Exploit 코드 맨 마지막에 삽입
- 쉘이 획득 되면 서버와의 상호작용 및 명령어를 전달한다.
7. ELF
ELF란 - ELF헤더는 바이너리파일에 존재하는 각종 정보들이 존재
ex) e = ELF('./test') - 라이브러리 연결
1. e.plt['func']
ex) puts = e.plt['puts'] - puts함수의 plt 주소를 가져옴
2. e.got['func']
ex) puts = e.got['puts'] - puts함수의 got 주소를 가져옴
3. e.symbols['func']
ex) puts = e.symbols['puts'] - puts함수의 offset주소를 가져옴, 함수,전역변수주소 포함
8. Context.log
Exploit 과정에서 버그가 발생시 디버깅을 하기위한 기능
1. context.log_level = 'error' - 에러만 출력
2. context.log_level = 'debug' - 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력
3. context.log_level = 'info' - 비교적 중요한 정보들만 출력
9. Context.arch
Pwntools에서 제공하는 ShellCode,어셈블리어,디스어셈블등의 기능을 대상아키텍처에 맞게 지정
1. context.arch = "amd64" - x86-64 아키텍처
2. context.arch = "i386" - x86 아키텍처
3. context.arch = "arm" - arm 아키텍처
10. fmtstr
1. fmtstr_payload(offset, {기존 함수 주소 : 덮어쓸 함수 주소}) - 포멧스트링을 편리하게 해줌
- 지정한 위치에 기존 함수 주소를 다른 주소로 덮어 쓰는 payload를 자동으로 생성해줌
11. ShellCode
shellcode = asm(shellcraft.execve("/bin/sh",0,0)) - execve("/bin/sh")를 호출하는 쉘코드
asm('mov rax, 0') - 어셈블리를 바이너리로 변환
disam(b'\xba\x00\x00\x00') - 바이너리를 어셈블리로 변환
12. ROP
e = ELF('./libc.so.6')
r = ROP(e) - ROP를 위한 객체 호출
poprdi = (r.fine_gadget(['pop rdi', 'ret']))[0] - 해당 바이너리파일에 존재하는 pop rdi; ret 가젯의 주소를 구함
이 외에도 Pwntools에는 많은 기능을 제공하며 Exploit과정에서
유용하게 쓰인다.
참고자료
https://dreamhack.io/
https://studyit312.tistory.com/216
https://whitel0tus.tistory.com/18
※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.
'System > Tips' 카테고리의 다른 글
[시스템] vi편집기에서 자동 줄 맞춤 (1) | 2021.12.05 |
---|---|
[시스템] pwntools에서 send (1) | 2021.12.01 |
프로그램 섹션 헤더 보는 명령어 (0) | 2021.11.14 |
ASLR 적용시 우회법 (0) | 2021.11.11 |
RTL이란? (0) | 2021.05.29 |