일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- kioptrix
- nmap
- plugin
- cve-2024-2242
- cve-2024-27954
- 악성코드
- really simple security plugin
- cve-2024-27956
- pentesting
- cve-2024-4439
- SQL Injection
- broken access control
- wp-automatic
- Burp Suite
- 1-day analysis
- MALWARE
- XSS
- DLL Injection
- LPE
- authentication bypass
- 모의해킹
- 악성코드 분석
- cve-2024-5084
- cve-2024-10924
- rce
- Stored XSS
- wordpress
- wp-automatic plugin
- Command Injection
- 리버스 쉘
- Today
- Total
목록Wargame (52)
Psalm

부모 프로세스의 pid의 파일 소유가작 root이면 쉘을 실행한다. /proc 디렉터리를 보면 다양한 프로세스가 실행되고 있다. 이 중 파일 소유자가 root인 프로세스가 이 프로그램을 실행하면된다. 이 중 pid가 1인 init 프로세스를 이용해서 쉘을 획득할 것이다. 부모 프로세스가 자식 프로세스보다 먼저 종료되면 init프로세스가 자식 프로세스의 부모 프로세스가 된다. 이 점을 이용해서 fork 함수를 이용해 코드를 짠다. 실행을 해주면 /tmp/shell 파일이 생겨나고, 실행해주니 쉘이 실행된다. 하지만 uid는 여전히 level19로 실행되고, mount로 확인해보니 /tmp폴더에서 nosuid가 설정되어 있다.(setuid가 걸려있어도 무시됨) 그래서 /home/flag19/로 경로를..

반복적으로 입력을 받아 해당 문자열에 대한 함수를 실행한다. shell을 입력하면 globalsl.loggedin이 설정되어 있으면 /bin/sh가 실행된다. globals.loggedin은 login함수에서 실행이되는데, 파일 열기에 실패하면 이 값이 설정된다. 현재 쉘 세션에서서 최대로 열수있는 파일의 개수가 1024로 설정되어 있다. 이점을 이용해서 쉘을 획득할거다. 1024가 넘어가면 파일 열기에 실패하고, login함수에서 globals.loggedin이 설정되는데, 이 점을 공략할 것이다. 위와같이 login문자열을 1021번 입력하고(stdin, stdout, stderr 파일 디스크립터가 있기때문), closelog, shell을 차례대로 입력한 파일을 만들어준다.그리고 출력인자를 f..

length가 1024바이트 이상이면 else문으로 분기한다. else문에서는 getrand함수를 호출해 특정경로에 랜덤 파일을 생성한다. level11의 rsa키를 flag11/.ssh경로에 주입시켜 로그인시 패스워드 없이 들어갈 수 있게 한다.getrand함수에서는 TEMP 환경변수에 있는 경로에 랜덤파일을 생성 한다. TEMP를 /tmp경로로 지정해준다. 2048비트의 rsa 키를 생성해주면, /home/level11/.ssh 폴더에 private키와 public 키가 생긴다. 이 public키를 /home/flag11/.ssh 에 복사하는게 목표인데, getrand함수에서 어떤 파일이 생성될지가 관건이다. 먼저 /home/flag11/.ssh/에 authorized_keys 파일명으로 심볼링 ..

10007포트에서 파이썬 프로그램 하나가 돌아가고 있다. pickle.load는 바이너리 데이터를 객체로 변환(역직렬화)하는 역할을 한다. 파이썬 docs에서 pickle 내용을 보면 언피클할 때 임의 코드가 실행되어 매우 취약하다고 한다.이렇게 직렬화된 코드를 넣으면 언피클되면서 hello world가 출력된다. 이 점을 활용해 홈 디렉토리에서 pickle에게 전달할 직혈화된 코드를 짠다. /bin/sh을 flag17디렉토리에 복사한 후 setuid를 설정한다. 그럼 이렇게 setuid가 걸린 sh파일이 하나 생성된다. 실행시켜주면 flag17권한으로 flag를 획득할 수 있게된다.reference: https://docs.python.org/3/library/pickle.html#module-..

perl로 작성된 웹서버가 1616포트로 실행되고 있다. username과 password를 입력받는다. 여기서 중요한점은 username에 command injection이 가능하다는 것이다. 웹서버는 flag16권한으로 실행되고이음으로 명령어를 flag16 권한으로 실행시킬 수 있다. tmp폴더에 파일 하나를 생성해주고, cp /bin/sh ./; chmod u+s sh를 입력해준다. 그 후 파일에 실행권한을 준다. 그리고 웹 서버에 접속해 username에 `/*/FLAG`를 입력해주면 아까 만든 쉘 파일이 실행된다.(/*/: 모든 경로에서 탐색한다는 의미) 그리고 flag16폴더에 가보면 setuid가 걸린 sh파일이 생성되고, 실행시키면 flag16권한을 획득할 수 있다.

바이너리를 실행하니 strace를 쓰라고 나온다. strace로 바이너리를 살펴보면 /var/tmp/flag15의 하위디렉토리를 검색하면서 libc.so.6 파일을 찾으려고 한다. 몇번의 실패를하고, flag15폴더만 여는데, 성공한다. 그리고 /lib/i386-linux-gnu/libc.so.6 파일을 열고, “strace it!”을 출력한다. objdump를 사용해서 바이너리를 분석할수도 있다. /var/tmp/flag15 디렉토리에 있는 libc.so.6 라이브러리를 사용해 컴파일 한것을 알 수 있다. 그리고 libc.so.6은 GLIBC_2.0 버전을 요구하는 것을 알 수 있다. version 파일을 하나 만들어주고, 버전에 맞게 컴파일한다. 그 후 flag15 바이너리를 실행해준다. 근데..

uid가 1000이면 token을 발행해준다. 그런데 현재 로그인된 계정은 level13(1014)이다. chown은 권한이 없어 불가능하고, 후킹을 활용해 조건문을 우회했다. 먼저 flag13 바이너리를 /tmp폴더로 복사해 uid를 level13으로 되게 한다.(LD_PRELOAD 환경변수는 자신이 권한을 가지지 않는 user 파일에 대해선 적용되지 않는다.) 그리고 간단하게 1000을 반환하게 하는 getuid함수를 간단하게 짠 후 라이브러리 파일로 컴파일 해준다.그다음 LD_PRELOAD로 환경변수 등록 후 실행하면 unistd.h에 있는 getuid보다 LD_PRELOAD에 등록된 라이브러리를 먼저 참조해 조건문이 우회되고, 토큰을 받을 수 있다.특정 바이너리 실행시에만 사용LD_PRELOA..