일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pentesting
- wp-automatic plugin
- cve-2024-10924
- kioptrix
- rce
- plugin
- SQL Injection
- broken access control
- authentication bypass
- Burp Suite
- really simple security plugin
- cve-2024-4439
- 모의해킹
- DLL Injection
- wp-automatic
- cve-2024-2242
- nmap
- 악성코드 분석
- 리버스 쉘
- Command Injection
- Stored XSS
- cve-2024-5084
- 악성코드
- wordpress
- cve-2024-27954
- 1-day analysis
- LPE
- cve-2024-27956
- XSS
- MALWARE
- Today
- Total
Psalm
Level 09 본문
setuid가 걸려있는 php 코드가 있고, 이걸 우회해 flag를 획득하면 된다.
spam함수로 “[email” 뒤에 오는 모든 문자를 전달하고, “.” 이가 나오면 “dot”으로 치환하고, ‘@’이가 나오면 “AT”으로 치환한다.
그리고 “[“가 나오면 “<”로 치환하고, “]”는 “>”로 치환한다.
여기서 취약점은 첫 번째 치환 함수에서 발생한다. “/e” 정규표현식은 치환 문자열을 php 코드 그대로 실행한다. (보안취약점 때문에 PHP 5.5.0 이후로 제거되었다.)
‘@’가 ‘AT’으로 ‘.’이 ‘dot’으로 바뀐걸 볼 수 있다.
그럼 어떻게하면 쉘을 실행시킬수 있을까?
파일을 생성할 수 있는 tmp폴더를 이용하면 된다.
tmp폴더에 쉘을 실행시킬 수 있는 코드의 파일을 만들고, 호출시키면 된다.
echo ‘[email {${system(sh)}}]’ > /tmp/content를 입력하고, 이 파일을 flag09를 실행시킬 때 넘겨주면 쉘이 실행된다.(spam함수 내에서 데이터 처리 후 값이 반환되고 나서 ‘/e’표현이 대체된 결과를 PHP코드로 실행해 쉘이 실행된다.)
실수한 부분:
처음에 echo “[email ${system(sh)}]” > /tmp/content/ 로 실행시켰더니 쉘에서 bad substitution 에러가 났다.
이유:
- 큰 따옴표 안에 있어 system(sh)를 쉘에서 하나의 변수로 취급하는데, 이 문자열로 정의한 변수가 없어 에러가 남
- 변수 이름에 괄호나 특수문자가 올 수 없음
해결 방법:
작은 따옴표를 이용해 문자 그대로 해석할 수 있게함
[email {${system(sh)}}]로 써야한다. 처음에 [email ${system(sh))}로 썼다 실행이 안됐는데, 그 이유는 system(sh)가 PHP코드 내에서 하나의 변수로 인식됐기 때문이다. 이걸 하나의 함수 표현식으로 나타내려면 {${system(sh)}}이런식으로 중괄호 안에 감싸줘야한다.