jNetPcap으로 패킷 캡처하기

 

payload는 실제로 서버와 통신에서 어떠한 캐릭터를 주고 받을 때 그러한 데이터가 들어가는 공간

 

예를들어 우리가 어떠한 웹사이트에 접속해서 그의 사이트에 로그인을 시도 한다던지 그럴 때 어떠한 로그인 정보를

 

보낼 때 이러한 페이로드에 담아 보낸다

 

package jNetPcap3;

import java.util.ArrayList;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapHeader;
import org.jnetpcap.PcapIf;
import org.jnetpcap.nio.JBuffer;
import org.jnetpcap.nio.JMemory;
import org.jnetpcap.packet.JRegistry;
import org.jnetpcap.packet.Payload;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.format.FormatUtils;
import org.jnetpcap.protocol.lan.Ethernet;
import org.jnetpcap.protocol.network.Ip4;
import org.jnetpcap.protocol.tcpip.Tcp;

public class Main {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {

		ArrayList<PcapIf> allDevs = new ArrayList<PcapIf>();
		StringBuilder errbuf = new StringBuilder();
		
		int r = Pcap.findAllDevs(allDevs, errbuf);
		if (r == Pcap.NOT_OK || allDevs.isEmpty()) {
			System.out.println("네트워크 장치를 찾을 수 없습니다. " + errbuf.toString());
			return;
		}
		
		System.out.println("[ 네트워크 장비 탐색 성공 ]");
		int i = 0;
		for (PcapIf device : allDevs) {
			String description = (device.getDescription() != null) ?
					device.getDescription() : "장비에 대한 설명이 없습니다.";
			System.out.printf("[%d번]: %s [%s]\n", i++, device.getName(), description);
		}
		
		PcapIf device = allDevs.get(0);
		System.out.printf("선택한 장치: %s\n", (device.getDescription() != null) ?
				device.getDescription() : device.getName());
		
		int snaplen = 64 * 1024;
		int flags = Pcap.MODE_PROMISCUOUS;
		int timeout = 10 * 1000;
		
		Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);
		
		if (pcap == null) {
			System.out.printf("패킷 캡처를 위해 네트워크 장치를 여는 데에 실패했습니다. 오류 : " 
					+ errbuf.toString());
			return;
		}
		
		Ethernet eth = new Ethernet();
		Ip4 ip = new Ip4();
		Tcp tcp = new Tcp();
		
		Payload payload = new Payload();
		PcapHeader header = new PcapHeader(JMemory.POINTER);
		JBuffer buf = new JBuffer(JMemory.POINTER);
		int id = JRegistry.mapDLTToId(pcap.datalink());
		
		while (pcap.nextEx(header, buf) != Pcap.NEXT_EX_NOT_OK) {
			PcapPacket packet = new PcapPacket(header, buf);
			packet.scan(id);
			System.out.printf("[ %d ]\n", packet.getFrameNumber());
			if (packet.hasHeader(eth)) {
				System.out.printf("출발지 MAC 주소 = %s\n도착지 MAC 주소 = %s\n",
						FormatUtils.mac(eth.source()), FormatUtils.mac(eth.destination()));
			}
			if (packet.hasHeader(ip)) {
				System.out.printf("출발지 IP 주소 = %s\n도착지 IP 주소 = %s\n",
						FormatUtils.ip(ip.source()), FormatUtils.ip(ip.destination()));		
			}
			if (packet.hasHeader(tcp)) {
				System.out.printf("출발지 TCP 주소 = %d\n도착지 TCP 주소 = %d\n",
					tcp.source(), tcp.destination());		
			}
			if (packet.hasHeader(payload)) {
				System.out.printf("페이로드의 길이 = %d\n", payload.getLength());
				System.out.print(payload.toHexdump());
			}
		}
		pcap.close();
	}

}

'Hacking > ARP 스푸핑' 카테고리의 다른 글

공부(10)  (0) 2021.09.10
공부(9)  (0) 2021.09.10
공부(7)  (0) 2021.09.09
공부(6)  (0) 2021.09.09
공부(5)  (0) 2021.09.09

jNetPcap 으로 MAC 주소 추출

 

package main;

import static org.jnetpcap.Pcap.NOT_OK;

import java.util.ArrayList;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;

public class Main {

	public static void main(String[] args) {

		ArrayList<PcapIf> allDevs = new ArrayList<PcapIf>();
		StringBuilder errbuf = new StringBuilder();
		
		int r = Pcap.findAllDevs(allDevs, errbuf);
		if (r == NOT_OK || allDevs.isEmpty()) {
			System.out.println("네트워크 장치를 찾을 수 없습니다. " + errbuf.toString());
			return;
		}
		
		System.out.println("[ 네트워크 장비 탐색 성공 ]");
		
		try {
		for (final PcapIf i : allDevs) {
			final byte[] mac = i.getHardwareAddress();
			if(mac==null) {
				continue;
			}
			System.out.printf("장치 주소 : %s\n 맥 주소 : %s\n", i.getName(), asString(mac));
		}
	} catch (Exception e) {
		e.printStackTrace();
		}
	}
	
	public static String asString(final byte[] mac) {
		final StringBuilder buf = new StringBuilder();
		for (byte b : mac) {
			if (buf.length() != 0) {
				buf.append(":");
			}
			if (b >= 0 && b <16) {
				buf.append('0');
			}
			buf.append(Integer.toHexString((b < 0) ? b + 256 : b).toUpperCase());
		}
		return buf.toString();
	}

}

'Hacking > ARP 스푸핑' 카테고리의 다른 글

공부(9)  (0) 2021.09.10
공부(8)  (0) 2021.09.10
공부(6)  (0) 2021.09.09
공부(5)  (0) 2021.09.09
공부(4)  (0) 2021.09.08

소켓 프로그래밍

 

package main;

import java.net.InetAddress;

public class Main {

	public static void main(String[] args) {
	
		InetAddress ip = null;
		try	{
			ip = InetAddress.getByName("www.google.com");
			System.out.println("호스트 이름: " + ip.getHostName());
			System.out.println("호스트 주소: " + ip.getHostAddress());
			System.out.println("내 주소: " + InetAddress.getLocalHost().getHostAddress());
		}	catch (Exception e)	{
			e.printStackTrace();
		}

	}

}

 컨트롤 쉬프트 O 를 누르면 import 부분이 생긴다

 

InetAddresss ip 값을 생성해주고 try catch 문을 이용한다

 

구글의 호스트 이름 주소 그리고 내 주소까지 출력해주고

 

만약 에러가 나면 그것을 추적하는것 까지 해준다

 

어떠한 전기 제품과 전선을 이어주는 역할을 하는것 자체를 소켓이라고 한다

 

프로그래밍에서도 마찬가지로 어떠한 연결 도구로써 작동을 한다

 

일반적으로 거의 모든프로그램은 서버를 가지고 있다

 

소켓 프로그램은 여러개 프로그램들이 서로 통신을 할 수 있게 만들어주는 하나의 프로그램인 규칙이라 할 수 있다

 

새로운 프로젝트 두개를 만들어주자

 

1. Client 2. Server 이렇게 만들어준다

 

둘다 main이라는 패키지 안에

 

Client는 Client 와 Main 클래스를 만들어주고

 

Server는 Server 와 Main 클래스를 만들어준다

 

Server의 Server.java를 먼저 작성하자

package main;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	private BufferedReader reader;
	private ServerSocket server = null;
	private Socket socket;
	
	public void start()	{
		try	{
			server = new ServerSocket(12345);
			System.out.println("서버가 활성화되었습니다.");
			while (true) {
				socket = server.accept();
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				getMessage();
			}
		} catch(Exception e)	{
			e.printStackTrace();
		} finally {
			try {
				if (reader != null) reader.close();
				if (socket != null) reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public void getMessage() {
		try {
			while (true) {
				System.out.println("클라이언트: " + reader.readLine());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

Client의 Client.java

package main;

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	
	private PrintWriter writer;
	private Socket socket;
	
	public void start() {
		try {
			socket = new Socket("127.0.0.1", 12345);
			System.out.println("서버에 접속했습니다.");
			writer = new PrintWriter(socket.getOutputStream(), true);
			Scanner scan = new Scanner(System.in);
			while (true) {
				writer.println(scan.next());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

 

Server의 Main.java

package main;

public class Main {

	public static void main(String[] args) {

		Server server = new Server();
		server.start();

	}
    
}

 

Client의 Main.java

package main;

public class Main {

	public static void main(String[] args) {
		
		Client client = new Client();
		client.start();

	}

}

 

이렇게 해주고 두 프로젝트의 Main.java를 둘 다 실행시켜주자

 

클라이언트로 입력하면 서버로 들어오는 것을 볼 수 있다

 

단어 단위로 데이터를 끊어서 보내도록 writer.println(scan.next()); 이렇게 만들어 놓았다

 

소켓 프로그램을 이용해서 작성한 것들은 실직적으로는 어떠한 패킷의 형태로써 서버와 클라이언트가

 

서로 데이터를 주고 받는것

 

물론 실제 패킷 안에 들어가 있는 정보들은 어떠한 바이트 스트림으로써 16진수 등으로 표현되어 있다

 

이것을 하나하나 계산하기 힘드니 우리가 쓰는것은 Socket 라이브러리를 사용한다

 

DNS 같은 경우는 특정한 호스트 이름을 가지고 실제 ip주소를 알아내는 하나의 프로토콜

 

 

 

'Hacking > ARP 스푸핑' 카테고리의 다른 글

공부(8)  (0) 2021.09.10
공부(7)  (0) 2021.09.09
공부(5)  (0) 2021.09.09
공부(4)  (0) 2021.09.08
공부(3)  (0) 2021.09.08

Wireshark 로 보게되면

 

주황색으로 보이는 것이 패킷

 

ARP 프로토콜에는 ARP request와 ARP relay

 

즉 특정한 사용자의 MAC 주소를 알아오는 ARP request 와 특정한 사용자의 MAC 주소를 알려주는 relay

 

6개의 아스키코드로 구성되어있어 ff ff ff ff ff ff 라고 나와있는 것은  브로드캐스트를 의미

 

해당 네트워크 안에 있는 모든 장비들한테 전부 다 보내겠다는 소리

 

즉 모든 자기란 뜻으로써 f가 들어가 있는 것임

 

Source 가 있는데 이것은 ARP request를 보내는 자기 자신의 MAC 주소를 의미

 

즉 보낸 맥주소를 출발지라고 할 수 있는 것

 

08 06 이라는 것은 ARP 프로토콜 이라는 것을 알려주는 약속 체계

 

00 01 은 Hardware type 으로 이더넷 이라는것을 알려준다 사실상 이거는 거의 안 바뀜

 

08 00 은 Protocol type 으로 IPv4를 뜻함 

 

ARP 프로토콜 중에서 정확한 request 라는 것을 의미하는건 00 01 

 

Sender MAC address 를 보면 보내는 사람의 맥 주소값을 알 수 있다

 

마지막 0000 ... 은 패딩값이다

 

follow - tcp stream을 이용하여 로그인 정보까지 알 수 있다

 

'Hacking > ARP 스푸핑' 카테고리의 다른 글

공부(7)  (0) 2021.09.09
공부(6)  (0) 2021.09.09
공부(4)  (0) 2021.09.08
공부(3)  (0) 2021.09.08
공부(2)  (0) 2021.09.08

+ Recent posts