•
개요
커맨드 인젝션(Command Injection)은 웹 애플리케이션이 사용자 입력을 제대로 검증하지 않고 시스템 명령어로 실행할 때 발생하는 취약점입니다. 공격자는 이 취약점을 이용해 시스템 명령어를 삽입하고, 원래 의도와 다르게 서버에서 임의의 명령을 실행할 수 있습니다. 이로 인해 시스템 제어권을 획득하거나 민감한 정보를 탈취할 수 있습니다.
•
공격 탐지 규칙 확인 및 설정 (Suricata & Zeek)
◦
Suricata
1.
Detection - “+”
Detection 메뉴 이동 및 “+”버튼 클릭, 룰 추가 메뉴 진입
2.
룰 작성
▪
Language : Suricata
▪
License : GPL-2.0-only
▪
Signature
alert http $EXTERNAL_NET any -> $HTTP_SERVERS any (msg:"Command Injection Attempt"; content:"ls"; http_client_body; nocase; flow:to_server,established; classtype:web-application-attack; sid:1000104; rev:2;)
Plain Text
복사
•
룰 내용 (Signature):
◦
alert http $EXTERNAL_NET any -> $HTTP_SERVERS any:
▪
alert: 공격이 감지되면 경고(alert)를 발생시킵니다.
▪
http: 이 룰은 HTTP 프로토콜을 사용하는 트래픽을 대상으로 합니다.
▪
$EXTERNAL_NET any: 외부 네트워크($EXTERNAL_NET)에서 오는 모든 포트의 트래픽을 감시합니다. 즉, 외부 클라이언트에서 발생하는 트래픽을 감시합니다.
▪
$HTTP_SERVERS any: 내부 네트워크의 HTTP 서버로 향하는 트래픽을 대상으로 합니다. $HTTP_SERVERS는 HTTP 서버를 가리키는 Suricata 변수입니다.
◦
msg:"Command Injection Attempt":
▪
탐지된 이벤트에 대한 설명 메시지입니다. 커맨드 인젝션 시도로 의심되는 상황에서 "Command Injection Attempt"라는 메시지를 출력합니다.
◦
content:"ls":
▪
HTTP 요청 본문에서 "ls" 문자열을 찾습니다. "ls"는 리눅스에서 디렉토리 내용을 나열하는 명령어로, 커맨드 인젝션 공격에서 자주 사용됩니다. 이 룰은 ls 명령어가 포함된 HTTP 요청을 감지합니다.
◦
http_client_body:
▪
이 필드는 HTTP 요청의 본문(body) 부분을 분석하는 데 사용됩니다. 주로 POST 요청에서 본문에 포함된 데이터를 대상으로 합니다.
◦
nocase:
▪
대소문자를 구분하지 않고 탐지합니다. 즉, ls, LS, Ls 등 다양한 대소문자 조합을 모두 감지합니다.
◦
flow,established:
▪
to_server: 클라이언트에서 서버로 향하는 트래픽을 대상으로 합니다. 즉, 서버로 가는 HTTP 요청을 분석합니다.
▪
established: 이미 연결된 상태에서 발생하는 트래픽만을 감시합니다.
◦
classtype:
▪
이 룰은 웹 애플리케이션 공격으로 분류됩니다. 이는 서버에 대한 웹 애플리케이션 공격(커맨드 인젝션)이 시도된 상황임을 나타냅니다.
◦
sid:1000104:
▪
Suricata에서 이 룰에 할당된 고유 식별자(SID)입니다. 1000104는 이 룰에 대한 고유 번호로, Suricata에서 탐지된 이벤트를 구분하는 데 사용됩니다.
◦
rev:2:
▪
이 룰의 버전 정보입니다. rev:2는 두 번째 수정된 버전임을 의미합니다.
•
공격 지표 확인 및 경고 필터링 (Kibana&zeek)
◦
suricata
▪
알람 발생 확인
◦
kibana & zeek
▪
Alert 로그 발생 확인
▪
Document
▪
하단에서 자세히 확인 (message)
•
대응 방안
◦
사용자 입력 값 검증 및 필터링
◦
명령어 실행 함수 사용 제한
◦
웹 애플리케이션 방화벽(WAF) 설정
◦
최소 권한 원칙 적용 및 권한 분리
◦
최신 보안 패치 및 업데이트 적용