Psalm

Level 09 본문

Wargame/Nebula

Level 09

hkhkhkh 2024. 7. 27. 13:20
반응형

 

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)}}이런식으로 중괄호 안에 감싸줘야한다.



반응형

'Wargame > Nebula' 카테고리의 다른 글

Level 12  (0) 2024.07.27
Level 10  (0) 2024.07.27
Level 08  (0) 2024.07.27
Level 07  (0) 2024.07.27
Level 04  (0) 2024.07.27
Comments