정보보안/Dreamhack

[Dreamhack, WarGame] 4. command injection

록스타★ 2024. 9. 20. 10:15
반응형

드림핵 4번 문제이다.

Ping 테스트를 입력하는 곳에 command injection을 이용하는 문제라는 걸 알 수 있다.

우선 Ping 테스트를 입력하고, 정상적으로 작동되는 것을 확인한다.

 

 

 


현재 서버에서 ping 테스트를 진행하면  ping -c 3 명령어와 똑같이 진행되는 것을 확인할 수 있다.

칼리 리눅스를 이용하여 똑같은 명령어를 실행해보았다.

패킷 로스등 네트워크 상태등 환경상황을 제외하곤 똑같은 명령어가 실행된다.

 

 


 

코드를 보면 ping -c 3 "{host}" 값이 있고 저 부분에 ping 명령어를 입력 후 다음 명령어에 연결하여 사용하면 될 것 같다.




커맨드 인젝션은 대부분 메타문자를 이용하여 공격 진행을 할 수 있으며, 

아래 표를 참고하면 된다.

 

메타문자 설명 예시 결과
; 명령어 구분자로 사용됩니다. 여러 명령어를 한 번에 실행할 때 사용합니다. ping 8.8.8.8; ls ping 명령 실행 후, ls 명령어 실행
&& 앞선 명령이 성공했을 때만 다음 명령을 실행합니다. ping 8.8.8.8 && ls ping 성공 후, ls 실행
`   ` 앞선 명령이 실패했을 때만 다음 명령을 실행합니다.
& 명령어를 백그라운드에서 실행합니다. ping 8.8.8.8 & ls ping이 백그라운드에서 실행되고, ls 즉시 실행
` ` 파이프(pipe)로, 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 전달합니다. `cat /etc/passwd
> 명령어의 출력을 파일에 저장합니다. ping 8.8.8.8 > result.txt ping 명령 결과를 result.txt에 저장 (덮어쓰기)
>> 명령어의 출력을 파일에 추가합니다. ping 8.8.8.8 >> result.txt ping 명령 결과를 result.txt에 추가
< 파일의 내용을 명령어의 입력으로 사용합니다. cat < input.txt input.txt의 내용을 cat으로 읽음
$() 명령어 치환. 내부 명령어를 먼저 실행하고 그 결과를 사용합니다. echo $(whoami) 현재 사용자 이름 출력
\ 메타문자 이스케이프. 메타문자의 기능을 무시하고 문자 그대로 처리합니다. echo \$PATH 환경 변수 대신 $PATH 문자열 그대로 출력
" (큰따옴표) 문자열을 감싸서 공백이 포함된 인자를 처리할 때 사용됩니다. echo "Hello World" Hello World 출력
' (작은따옴표) 작은따옴표 안의 모든 문자를 리터럴로 처리합니다. echo '$HOME' $HOME 문자열 그대로 출력
``` (백틱) 명령어 치환. 백틱 안의 명령어를 먼저 실행하고 그 결과를 사용합니다. (현대 시스템에서는 $()로 대체됨) echo `whoami` 현재 사용자 이름 출력

 

 


우선 난 메타문자 &&를 사용하여 진행을 하려고 작성을 하였는데,

요청한 형식과 일치하지 않는다고 하여 F12를 눌러 input 태그부분을 확인한다.

 

 


F12를 열어 코드를 보니 input 태그 부분에 HTML pattern으로 유효성? 검사를 진행하고 있어, 저 부분을 삭제하고 입력한다.

 

 

 


실행은 됐지만 ping, ls 두 명령어 모두 실행되지 않는 에러가 발생하였다.


메타 문자 입력 부분에 조금 수정을 해주어 작성하고, 

ping 명령어와 ls 명령어가 정상적으로 출력 하는 것을 확인하였고,

ls명령어로 출력된 리스트에 flag.py가 있는 걸 확인하였고, 다시 flag.py를 실행하면 된다.

 

 


cat 명령어를 이용하여 flag.py를 실행하였고, 정상적으로 flag값을 확인할 수 있다.

 

 


요약

1. 문제 서버 파일 다운로드 및 서버 생성
2. Ping 테스트 진행
  > ex) 8.8.8.8
3. 문제 스크립트 실행
 - flask 서버로 생성되었으며, host의 값을 검증없이 받아서 이용함
4. 메타문자를 이용하여 삽입 공격 실행하나 input 태그의 패턴으로 인하여 삽입 실패, F12를 눌러 HTML5 pattern 부분 삭제
5. 삽입공격 재실행
 - 8.8.8.8"&&"ls
6. flag.py 파일 확인
7. 8.8.8.8"&&"cat " " flag.py
 - cat과 flag.py사이에도 메타문자 사용

 

 

후기

오랜만에 포스팅이기도하고, 이번에는 문제를 푸는 데 조금 시간이 걸렸다. 점점 갈수록 어려워 지는 것 같다.

반응형