일전에 ANSI2TXT 글을 쓰면서 ANSI 제어코드를 사용한 공격이 가능하다고 언급한 바 있다.
관련된 내용을 써보고자 했는데 미루는 동안에 Unicode를 활용한 공격 기법이 공개되어 해당 글을 먼저 게시하였다.
ANSI 제어코드는 오래전부터 사용되었기 때문에 공격의 역사는 꽤나 길다고 할 수 있다. 내 경우에는 PC 통신망 시절에의 트릭 기법들이 얼핏 떠오르는데 현재는 자세히 기억이 나지는 않는다.
유명 해커인 H.D. Moore 또한 터미널에서의 안시 악용 방법을 공개한 바도 있다.
대부분의 취약점이 직접적으로 코드가 실행되기 보다는 사용자를 속이기 위한 트릭에 가깝고 고전의 기법으로 인식되고 있지만 가끔씩 잊혀지지 않고 보고되기도 하는것 같다.
Hackerone: Escape sequce injection in “summary field”
ansi escape sequence injection in add-apt-repository
놀랍게도 Amazon AWS의 CloudShell에 취약점이 존재하는데 H.D. Moore가 발표한 시절의 취약점이 여전히 적용되고 있다.
Issue 2154: Terminal escape injection in AWS CloudShell
취약점을 이해하기 위한 간단한 예는 아래와 같다.
백 스페이스를 의미하는 ^H 제어코드에 의하여 확인된 코드의 내용과 실제 출력되는 내용이 다르게된다.
위의 예제는 단순한 눈속임처럼 보이지만 아래와 같은 예제는 실행되는 코드를 숨길 수 있기 때문에 문제의 소지가 존재한다.
아래의 사이트에서 위의 예제를 포함하는 몇가지 예제를 확인할 수 있다.
예제에 사용된 코드를 아래에 첨부한다.
a.sh
#!/bin/sh
echo "aaaa^H"
script.sh
#!/bin/sh
echo "evil!"
exit 0
^[[2Aecho "Hello World!"
^H는 문자 그대로 아닌 Backspace (0x08)을 의미한다. ^[로 표시되는 ESC 값은 0x1B 이다.
Unix 터미널 상에서 제어코드를 입력하기 위해서 ^H는 Ctrl+V 입력 후 Ctrl+H를 이어 입력하며 ESC 코드는 Ctrl+V 입력 후 Ctrl+[ 를 입력하였다.