Scapy를 이용한 간단한 IP 주소 스캐닝 툴입니다. 같은 네트워크 내에 있는 호스트들의 IP 주소와 MAC 주소를 알아올 수 있다(arp 이용). 사실 성능이나 이런 저런 면은 생각하지 않고 단순히 Scapy를 사용해서 간단하게 스캐닝 하는 방법을 이용한것이므로 실제 사용하기에는 무리가 있음 ㅎ
from scapy.all import *
import sys
s=[]
for i in range(1,255):
##서브넷 주소만 입력받기
arp_req=Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(op=1, pdst=sys.argv[1]+"."+str(i))
arp_ans=srp1(arp_req, timeout=0.5)
if arp_ans:
##존재한다면 저장
s.append(str(sys.argv[1]+"."+str(i)+" is at "+arp_ans[ARP].hwsrc))
##실행중인 호스트들 출력
for j in range(0,len(s)):
print(s[j])
ARP 요청을 보내서 올바른 응답이 온다면 해당 호스트가 존재하는 것으로, 응답이 오지 않는다면 호스트가 존재하지 않는 것으로 판단하는 코드를 작성했다.
먼저 실행 인자로 서브넷 주소만 입력
끝까지 스캐닝이 끝나고 나면
위처럼 같은 네트워크 상에 존재하는 호스트들의 IP 주소와 네트워크 주소를 받아올 수 있게 된다
arp_req=Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(op=1, pdst=sys.argv[1]+"."+str(i))
Scapy는 위처럼 네트워크 레이어 별 패킷 헤더를 구성할 수 있는 함수들을 제공한다. Ether 함수의 dst를 ff:ff:ff:ff:ff:ff로 설정하므로써 Broadcast 할 수 있고, 다음 ARP 헤더는 opcode 1, 즉 요청 패킷임을 명시하고 pdst(==IP destination)를 입력받은 서브넷 내에 있는 모든 IP 주소들로 보내면서 동일 네트워크 내에 있는 모든 호스트들에게 ARP 요청 패킷을 보낼 수 있음
arp_ans=srp1(arp_req, timeout=0.5)
if arp_ans:
##존재한다면 저장
s.append(str(sys.argv[1]+"."+str(i)+" is at "+arp_ans[ARP].hwsrc))
응답을 받는 함수는 srp1()입니다. 이를 사용하여 응답을 받고, 응답이 존재한다면 리스트에 append 하여 응답의 hwsrc, 즉 존재하는 호스트가 응답을 주었다면 해당 호스트의 IP 주소와 MAC 주소를 저장하도록 했다.
무지하게 간단한 코드라 쓸지 말지 고민을 했지만... Scapy를 시작하기에는 적당히 괜찮은 함수도 사용한 예제라고 생각합니다 훗훗
'Network > Programming' 카테고리의 다른 글
[Network programming] Wireshark staitistics 따라하기 (0) | 2020.01.24 |
---|---|
[Network programming] pcap library를 사용한 패킷 정보 출력 (0) | 2020.01.23 |