(belom selesai nihh..lagi pusing) Linux mendukung TCP/IP, disini akan dijelaskan bagaimana membuat suatu program (network) daemon proses, dengan BSD socket interface dengan menggunakan bahasa C/C++. Untuk itu diharapkan anda sudah familiar dengan pemrograman C/C++ di linux dan topik seperti fork, signal dll. Setelaih itu kita akan lihat program sederhana yang sederhana yang mengimplementasikan BSD socket untuk membuat trojan atau backdoor. Saya bukan "master" jadi jangan mengharap banyak dari tutorial ini, saya cuma mengajak belajar bersama karena semua ini menyenagkan. Untuk lebih jelas mengenai fungsi2 dalam tutorial ini sebaiknya anda melihat rujukan manual dalam section 2 (mudahnya ketikan perntintah "man listen" misalnya, untuk melihat manual dari fungsi listen())
Jenis Protokol
Protokol sekarang ini yang banyak digunakan dalam internet adalah Transmission Control Protocol (TCP) dan User Datagram Protocol (UDP). Socket untuk suatu aplikasi tertentu di identifikasi dengan nomor port, . TCP atau UDP merupakan protokol ditingkat application layer, keduanya menggunakan Internet Protocol (IP) untuk mengenali / mengidentifikasi
alamat mesin. TCP/IP terdiri dari dua bagian yaitu alamat IP yang mengidentifikasi mesin dan port yang mengidentifikasi suatu jenis aplikasi yang berjalan di mesin tersebut.Nomor port adalah bilangan bulat dari 1 keatas. Port antara 1 dan IPPORT_RESERVED (yang di definisikan di /usr/include/netinet/in.h -- biasaya 1024) yang disediakan system untuk digunakan(anda harus root jika ingin membuat server dan bind port). Dua jenis tipe internet socket tersebut biasa disebut juga Stream Sockets (SOCK_STREAM) dan Datagram Sockets (SOCK_DGRAM). Datagram Sockets, yang menggunakan TCP sebagai protokol, memiliki sifat error free (karena ada mekanisme pengecekan kesalahan), data dikirimkan dibundel dalam satu grup disebut datagram. Sedangkan Stream Sockets, yang menggunakan UDP sebagai protokol, sangat riskan terhadap error dan sering disebut sebagai connectionless artinya socket ini selalu terbuka dan siap menerima informasi tanpa harus ada mekanisme membuka koneksi dengan sifat ini informasi bisa lebih cepat dibanding datagram socket karena data dikirim perkarakter. Aplikasi sederhana dari networking adalah client-server model. Sebuah proses server menunggu koneksi dari suatu client proses. Ketika koneksi terjadi maka Socket interproses comunication (IPC) Untuk membuat sebuah aplikasi server dengan menggunakan BSD interface, maka diperlukan langkah2 berikut: 1. 2. 3. 4. Membuat socket baru dengan fungsi socket() mem-bind suatu alamat (alamat Ip dan nomor port) ke socket dengan fungsi bind()Langkah ini mengidentifikasi server sehingga client tau kemana dia harus pergi. Listen (mendengarkan) apakah ada request koneksi baru di socket dengan fungsi listen() Menerima koneksi baru dengan fungsi accetpt()
Biasanya service/layanan pada server harus disediakan dalam jangka waktu lama, dan harus bisa menerima koneksi atau memberikan beberapa layanan sekaligus. Untuk itu server harus dapat menerima dan memproses koneksi baru ketika dia sedang menjalankan proses dari koneksi yang lain. Untuk dapat melakukan hal tersebut maka biasanya implementasi server dilakukan dengan fork atau pencabangan, sehingga server melakukan pencabangan yaitu membuat proses (thread) baru yang mendengarkan koneksi baru bersamaan ketika server meng-accept suatu koneksi. Inilah yang disebut multithreading, sebuah komputer melakukan beberapa proses sekaligus dalam waktu bersamaan, satu thread memproses inforsi yang sudah datang dan thread yang lain tetap sebagai proses menunggu koneksi baru. Representasi aplikasi program client/server dapat digambarkan sbb: CLIENT SERVER +-------------------------------+ +-----------------------------------------------+ | Buat client socket | | Socket di server di buat | | Menentukakan address server | | Penentuan address (alamat Ip dan port) | | | | Address dibind pada socket | | | | Server menunggu koneksi yang datang (listen) | | | | |
| | | while (true) { | | Mencoba koneksi ke server <-+-------+-> jika koneksi datang | | Koneksi terjadi <-+-------+-> accept } | | Komunikasi dengan server <-+-------+-> process request | | Close_connection <-+-------+-> close_connection | +-------------------------------+ +-----------------------------------------------+
Identitas lain iyang penting saat pembuatan socket adalah jenis/tipe socket, yaitu stream socket atau datagram socket. seperti telah dijelaskan diatas. Pilihlah tipe socket yang sesuai kebutuhan. Setelah telpon terinstal maka yang dilakukannya adalah menunggu sambungan, dalam socket ini dilakukan dengan fungsi listen(). Jika terjadi sambungan dan telpon akan diterima untuk memulai komunikasi maka kita memberikan fungsi accept() pada analogi komunikasi socket.
Pembuatan Socket
Pembuatan socket dilakukan dengan menggunakan system call socket() System call ini didefinisikan di header file socket.h, dan kebanyakan fungsi2 atau system call pada pemrograman socket didefinisikan pada file header tersebut. Untuk itu jangan lupa untuk mendeklarasikannya #include #include Sytem call socket memiliki prototipe sebagai berikut: int socket(int domain, int type, int protocol); nilai balik (return value) dari system call ini adalah -1 jika terjadi error saat pembuatan socket dan domain adalah address dari domain create INTERNET,TCP socket int sock; sock = socket(AF_INET, SOCK_STREAM, 0); handle error if ( sock < 0 ) { /* ERROR */ } /* /* tipe koneksi */ /*
Pengalamatan (binding)
int bind(int sockfd, struct sockaddr *my_addr, int addrlen); int getsockname(int s , struct sockaddr * name , socklen_t * namelen ) pendefinisian tipe soket struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; atau server. sin_ addr = htonl( INADDR_ ANY ); pendefinisian nomor port spesifik yang digunakan constant int TCPPORT=89; server.sin_port = htons(TCPPORT); binding protocol to socket if (bind(sock, &server, sizeof(server))) { /* ERROR */ }
Penerimaan Koneksi
int accept(int s, struct sockaddr *addr, int *addrlen); int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
main(int argc,char **argv) { int sock; int size; char buf[BUFSIZE]; int msgsock; struct sockaddr_in gotcha; int rc; int i; sock = initSocket(); /** tcp starts listening for connections */ rc = listen(sock,5); if ( rc < 0) { perror("listen"); exit(1); /** accept one connection, will block here. */ size = sizeof (struct sockaddr_in); msgsock = accept(sock, &gotcha, &size); if (msgsock < 0 ) { perror("accept"); exit(1); } /* read and echo so many packets */ for ( i = 0; i < NOREADS; i++) { doRead(msgsock, buf, BUFSIZE); rc = write(msgsock, buf, BUFSIZE); if ( rc < 0 ) { perror("write"); exit(1); }
} /* close sockets */ close(msgsock); close(sock); return(0); } initSocket() { struct sockaddr_in server; int sock; /** create INTERNET,TCP socket */ sock = socket(AF_INET, SOCK_STREAM, 0); if ( sock < 0 ) { perror("socket"); exit(1); server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(TCPPORT);
/* specific port */
/** bind protocol to socket */ if (bind(sock, &server, sizeof(server))) { perror("bind"); exit(1); } } doRead(int sock,char *buf,int amountNeeded) { register int i; int rc; char *bpt; int count = amountNeeded; int amtread; bpt = buf; amtread = 0; again: if ( (rc = read(sock,bpt,count)) < 0 ) { perror("doRead: reading socket stream"); exit(1); } amtread += rc; if ( amtread < amountNeeded ) { count = count - rc; bpt = bpt + rc; goto again; } return(sock);
/* end of file : tcpserver.c */ Dan ini contoh file client yang akan menghubungi server diatas:
2.
3.
Pemilihan nama program yang tidak mencurigakan,atau lebih baik jika program dapat dilihat dengan nama proses yang berbeda dari sebenarnya. Cara lain untuk menyembunyikan proses adalah dengan menggunakan rootkit, yaitu, biasanya mengganti program standar untuk melihat proses (perintah ps) dengan program yang serupa tapi tak sama =) sehingga proses yang ingin kita hidden menjadi tidak telihat. Hal ini penting karena program kita akan berjalan terus sebagai daemon. Pemilihan port yang 'aneh'. Hmmm.. aneh disini tidak perlu memilih port bilangan yang tidak biasa misalnya 6732 tapi bisa dengan "justru" memilih port yang sangat umum yang tidak digunakan. Misalnya server itu tidak menggunakan port 110 untuk POP3 service maka port kita dapat mengambil port tersebut danmudah2an adminya lupa sehingga dia merasa dia sendiri yang membuka port tersebut untuk keperluan POP3. Dengan begini program backdoor kita dapat kita berinama juga yang sesuai misalnya qpopper.. Program utama untuk mengakses shell atau untuk membuat shell baru Backdoor dapat sangat simpel yaitu dengan memberikan program utama kita hanya suatu akses pada perintah tertentu misalnya pembuatan user shell baru yang kemudian akan diakses dengan cara biasa (misalnya telnet) atau berisi program ekseskusi eksploit sehingga membuka jalan lain ke akses shell. Sedangkan trojan akan lebih kompleks sebab dibutuhkan akses ke beberpa perintah standar UNIX yang penting atau akses langsung ke shell.
4.
Pembatasan akses pada backdoor kita. Artinya perlu ada mekanisme kontrol sehingga backdoor kita tidak digunakan politikus2 tak bermoral, pemeras yang hanya memikirkan diri sendiri dan mengabaikan hak-hak orang lain. Tetapi justru backdoor kita gunakan untuk mengontrol mereka, untuk itu kita perlu lebih pintar dari mereka. Perlu adanya proteksi atau authentifikasi misalnya password protection pada backdoor kita. Perlu diingat jangan berpikir terlalu muluk, justru kadang dengan hal-hal kecil yang sangat simpel kita dapat lebih "cerdik" dari orang lain.
Jadi ngelantur banyak nih, ok ini cuma sekedar tips "hacking," tips lainnya dapat anda tanyakan pada insting sendiri.
Link