아임노드

실무 환경에서의 주요 취약점_Command Injection 본문

[SK shieldus Rookies 23기] 공부 노트/취약점 진단 도구 및 활용법

실무 환경에서의 주요 취약점_Command Injection

Noody 2024. 12. 12.

 

Command Injection
- 명령어 주입 공격 (여기서의 명령어는 OS에서 지원하는 명령어)
- 일반 웹페이지에서는 잘 안나타남 - 임베디드 장비에서 주로 발견(공유기,프린터,CCTV등)
  ex) http://test.com/cmd?=;ls
  명령어를 추가로 사용할 수 있는 입력 문자열을 통해 추가 명령어 실행
  - ; , |, ||, && 4개의 문자열이 대표적인 추가 명령어 실행 입력 값
    ; + ls / | + ls ...

 


Command Injection

1. dvwa > Command Injection(security level:low) 탭으로 이동

* security level은 DVWA Security탭에서 변경 가능

 

 

2. 오른쪽 하단 view source 클릭

이 부분을 확인하기

ping은 통신상태를 나타냄

shell_exec 함수외에도 system 함수도 있다.

이런 함수들이 홈페이지를 구성하는 페이지에서 사용되면 취약하다! 라고 판단해볼 수 있다.

 

 

3. 앞선 취약상태 인지 후 터미널 창에서 테스트 진행

 

> ; , | , || , && 네 가지 문자열이 가지는 성질 확인해보기

# ls -al ; pwd
-> ls -al 과 pwd 모두 실행
# ls -1234 ; pwd
-> ls -al 실행x / pwd 실행

=>  앞에 명령이 성공하든 실패하든 ;(세미콜론) 뒤 명령어는 실행된다!

 

# ls -al | pwd
-> 앞이 참이면 뒤가 실행
# ls -1234 | pwd
-> 앞이 거짓이면 뒤에 실행X

=> 앞의 참/거짓에 따라 뒤가 실행되거나 실행되지 않는다!

 

# ls -al || pwd
-> 앞이 성공하면 뒤가 실행X
# ls -1234 || pwd
앞이 실패하면 뒤가 실행O

=> 앞 참/거짓 여부에 따라 뒤는 반대결과가 실행된다!

 

# ls -al && pwd
-> 모두 실행O
# ls -1234 && pwd
-> 모두 실행X

=> 모두 참일 경우만 출력된다!

 

 

4. 위 문자열 성질을 가지고 취약점 진단해보기

* 127.0.0.1은 현재 기기의 로컬 IP 주소

 

...

 

 

5. Burpsuite로 패킷 잡아보기

> 127.0.0.1 적어준 상태에서

> 프록시 manual로 바꾸고 burpsuite의 Intercept is on으로 변경

> 위 사진의 submit 눌러주면 burpsuite에서 패킷 확인 가능

 

> 이 상태에서는 재생공격이 가능하다.

[ctrl+R] 누르기 > Repeater 탭 색상 바뀜(수집한 패킷을 send to Repeater 한 것임)

 

> 여기서 ip 파라미터에 ;pwd 추가해보기

추가 후 send 클릭

 

> 결과 확인

127.0.0.1 이 PING 으로 실행되고 그 아래 pwd가 실행된 것도 확인할 수 있다.

이걸로 패킷을 재사용해서 점검하는 것도 가능하구나를 알 수 있다.

 

 

6. High 레벨에서 다시 점검해보기

>high 레벨의 Command Ingjection 탭으로 이동 (소스코드 없이 진단)

 

> 4가지 입력값을 가지고 넣어 볼 수 있는 경우의 수 (우회)

다시 127.0.0.1 입력 후 패킷잡기

기준

ip=127.0.0.1&Submit=Submit

  ㄴ&Submit=Submit 는 고정 값이므로 ip 파라미터만 보도록 한다.

 

ip=127.0.0.1 로 우회할 수 있는 방법 찾기

둘 다 실행X

 

 

이번에는 공백을 넣어보도록 하자.

여기서는 ;에 대한 7번의 경우의 수 + 나머지 세 개의 문자열 경우의 수까지 포함하여

총 28번의 테스트를 진행해야 한다. 

 1) 127.0.0.1 ; ls    (데이터 간에 공백 입력)
 2) 127.0.0.1; ls     (뒤에만 공백 입력)
 3) 127.0.0.1 ;ls     (앞에만 공백 입력)
 4) 127.0.0.1%20;ls     (%20=공백)
 5) 127.0.0.1%00;ls     (%00=null)
 6) 127.0.0.1;%20ls
 7) 127.0.0.1;%00ls

 

* 스패이스(공백), %20, %00은 단순히 한번이 아니라 여러번이 될 수도 있다.

 (최소 3개 이상은 해봐야 필터링이 되는지 아닌지 보다 정확히 확인 가능)

* 일반적으로 burpsuite Repeater 창에서 Response을 보고 실행이 됬는지 아닌지 확인하면 되지만

 dvwa에서는 그냥 'Enter an IP address:' 검색에다가 테스트해봐도 된다.

* ||는 ip 주소를 뺀 상태에서도 진행해보도록 한다. (ip=||ls&Submit=Submit)

* 명령어 뒤에 넣는 경우도 있는 (ex) ip=127.0.0.1&&ls%00%00%00&Submit=Submit

 

 

> 우회 가능한 경우 확인

  • ip=127.0.0.1|ls&Submit=Submit
  • ip=||     ls&Submit=Submit

 

7. 소스코드 보기

소스코드를 볼 수 있는 경우 이러한 것들을 확인해볼 수 있다.

>시큐어 코딩 적용됨

여기서 | 에 한 칸이 띄어져 있었기에 우회가 가능했다.

 


 

bwapp 홈페이지 A1 OS Command Injection에서도 테스트 해보자.