2009. május 28., csütörtök

Netcat proxy második nekifutás

Előző gondolatmenetet kicsit tovább vittem. Tegyük fel, hogy állandóan proxyzni szeretnénk egy porton. Ha az alábbi parancsot használjuk:
nc -l -p 31337 0<backstream | nc google.hu 80 1>backstream

akkor ha csatlakozunk a böngészőnkkel, bejön a google.hu, de a program ki is lép a routeren, így ha másodikra is próbálkozunk, nem fog már bejönni a honlap. Mit tehetünk ilyenkor? Erre találták ki a inetd-t vagy Xinetd-t. Én most a Xinetd-s megoldást fogom vázolni. Elsőre is az /etc/services fájlban létre kéne hozni az új szolgáltatásunkat. Ezt az alábbi sorral tehetjük meg:
duckroll        31337/tcp                       # duckrolling nc

Létre is hoztuk a duckroll servicet, ami bizony a 31337-es tcp portot használja. Ezekután jöhet a Xinetd bejegyzés. Hozzunk létre egy filet az /etc/xinetd.d/-ben:
touch /etc/xinetd.d/duckroll

És másoljuk bele a következőt:
service duckroll
{
flags = Reuse
socket_type = stream
wait = no
user = root
protocol = tcp
server = /root/duckroll.sh
only_from = localhost 10.0.0.0/8
disable = no
}

Az only_from mezőt értelemszerűen töltsük ki, hogy a saját hálónkról is be tudjunk lépni (pl 192.168.0.0/24). Nézzük mi is kerüljön a /root/duckroll.sh-ba:
#!/bin/bash
/bin/nc google.hu 80

Ezekután már akárhányszor csatlakozunk a 31337-es portunkra, mindig a google.hu fog bejönni.
Oké, de mi az értelme ennek az egésznek. Elmélkedjünk rajt egy kicsit. Lényegében az adatforgalmat átdobtuk egy shell scripten, amiben össze vissza loggolhatjuk és átírhatjuk az egészet. Nézzünk egy példát:
#!/bin/bash
/bin/tee -a forgalom.log | /bin/nc google.hu 80

Most a forgalom.log-ba már láthatjuk is a böngészőnk által küldött kérést. Nézzük tovább:
#!/bin/bash
/bin/sed -u s/duckroll/rickroll/ | /bin/nc google.hu 80

Lehet tippelni. Ha esetleg valaki a hálón rákeresne a duckrollra, akkor rickroll eredményét fogja megkapni. Persze miért írná be bárki is a google.hu cím helyett a routerünk címét, ráadásul a 31337-es porttal utána. Ez így elég furcsa... De egy iptables szabály segíthet a problémán:
iptables -t nat -A PREROUTING -p tcp --dport 80 -d google.hu -j REDIRECT --to-port 31337

A REDIRECT mindig a routernek a --to-port-ban megadott portjára küldi a csomagokat tovább. Így már ha simán a google.hu-ra vagyunk kiváncsiak is a proxyzott, shell scripten átfuttatott oldalt kapjuk.
Ez szép és jó, de most már igazán nézhetnénk valami hasznos példát az egészre... Tegyük fel, hogy egy adott torrent oldalon például az arányunkkal akarunk játszani. Mi minden kéne:
  • iptables-ben egy szabály ami a torrent oldal felé haladó kapcsolatokat beszipkázza.
  • egy script ami az adatokat megfelelően módosítja
Az iptables szabály valahogy így nézne ki:
iptables -t nat -A PREROUTING -p tcp --dport PORT -d HOST -j REDIRECT --to-port 31337

PORT: a torrent tracker portja (pl 11337)
HOST: a torrent tracker címe (pl ... :)
A duckroll.sh scriptünk valami ilyesmi is lehetne, ha mondjuk az általunk letöltött mennyiséget szeretnénk kinullázni (freeleech):
#!/bin/bash
/bin/sed -u 's/downloaded=.*\&left/downloaded=0\&left/' | /bin/nc HOST PORT

És kész is vagyunk. Innéttől ha a torrent kliensünk kapcsolódni akar a trackerhez, a kapcsolatot elkapja a routerünk, átírja benne az általunk letöltött mennyiséget nullára, majd továbbítja az adatokat. Persze a trackerek nagyrésze az ilyen ügyeskedéseket figyeli, és bannolja a csalókat. Egy bonyolultabb scripttel akár ésszerű feltöltést is lehet szimulálni.

Gondoljuk csak végig, milyen könnyen és milyen kevés alap unix eszközzel sikerült ezt elérnünk. Hasonló módszerrel különböző adatfolyamokat manipulálhat bárki, ezt kombinálva mitm támadásokkal könnyedén lehet rosszindulatú kódot bejuttatni egyes adatfolyamokba...

Ajánlott irodalom:
http://www.linuxfocus.org/English/November2000/article175.shtml
http://www.stearns.org/doc/nc-intro.v0.80.html

#eof

2009. május 27., szerda

Netcat proxy

Sok helyen olvastam, hogy ez lehetséges, de valahogy igazi élő példát nem találtam rá. Viszont amit találtam:

mkfifo backstream
nc -l -p 31337 0<backstream | nc google.hu 80 1>backstream

Ezek után ha csatlakozunk a gépünk 31337-es portjára egy böngészővel, jó eséllyel a google.hu fog bejönni. Oké, ez frankó, de mire megyünk vele? Ebben a formában tényleg nem sokra. De tegyük fel, hogy valahol egy tűzfal mögött ücsörgünk, és szeretnénk ircezni, de csak a 80as port van engedélyezve kifele (suli, meló, stb).

mkfifo backstream
nc -l -p 31337 0<backstream | nc irc.atw.hu 6667 1>backstream

Most ha kívülről csatlakoznánk az otthoni gépünk 80as portjára egy irc klienssel mondjuk, akkor az továbbküldene minket az atw.irc.hu 6667es portjára. Persze erre sok más és talán egyszerűbb megoldás is létezik. Mégis miért lenne érdemes ezt így megvalósítani? Itt lényegében akármilyen egyéb shellscriptet közbe szúrhatunk, pl:

mkfifo backstream
nc -l -p 31337 0<backstream | sed -u s/rick/duck/g | nc irc.atw.hu 6667 1>backstream

Ezt használva ezentúl ircen akárhányszor azt írjuk be a kliensünkbe, hogy rick, a többiek duck-ot fognak látni. Magyarul megváltoztattuk az áthaladó adatfolyamot. És ezt kombinálva pár egyéb technikával igen komoly eredményeket érhetünk el...

#eof

2009. május 24., vasárnap

FreeBSD + Metasploit

Bár én debian linux párti vagyok, utóbbi időben FreeBSD-vel foglalkozom. Nézzük egyik kedvenc játékszerünket, a Metasploitot hogyan tudjuk felrakni a mi kis nyers FreeBSD-nkre. Én általában mindent ports forrásokból installálok, szóval így fogom leírni ezt is. Mire lesz szükségünk:
  • Ruby – Ebben írták az MSF3-at
  • Postgresql szerver – msf3 autopown részéhez nemárt egy jó adatbázis.
  • Subversion – hogy frissen tudjuk tartani az állományainkat :)
A postgresql nem kötelező, de nem is árt ha van, hisz az autopwn funkciót adatbázisok segítségével használhatjuk ki. Egy másik bejegyzésben foglalkoztam a telepítésével.
Nézzük mi kell a rubyhoz. A rubynak jelenleg egy bugos verziója van a ports forrásban: ruby 1.8.7 p72 , így nem ússzuk meg annyira simán a dolgot. (Ha már újabb verzió került a portsba, akkor a következő pár lépés kihagyható.) Elsőre lépjünk be a ruby mappájába, és bontsuk ki a forrását:
[root@rogue ~]# cd /usr/ports/lang/ruby18/
[root@rogue /usr/ports/lang/ruby18]# make extract

A javítás amire szükségünk van itt érhető el:
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18485
Lépjünk át a /usr/ports/lang/ruby18/work/ruby-1.8.7-p72 könyvtárba és a 3 fájlt (class.c, eval.c, node.h) cseréljük le a javítottakra a linken. Ezután már folytathatjuk az installálást:
[root@rogue ~]# cd /usr/ports/lang/ruby18/
[root@rogue /usr/ports/lang/ruby18]# make install clean
...

Ha ez megvan, szükségünk lehet még pár gemre rubyhoz: activerecord és postgres
[root@rogue ~]# cd /usr/ports/devel/ruby-gems/
[root@rogue /usr/ports/devel/ruby-gems]# make install clean
...
[root@rogue /usr/ports/devel/ruby-gems]# gem install activerecord postgres
...

A fejlesztői változat beszerzéséhez és frissen tartásához subverion klienst fogunk használni. A telepítése:
[root@rogue ~]# cd /usr/ports/devel/subversion
[root@rogue /usr/ports/devel/subversion]# make install clean
...

A mindenféle felbukkanó kérdőíveknél nyugodtan hagyjuk meg az alapbeállításokat. Ha a postgresqlt is telepítettük, most létrehozhatunk egy adatbázist és egy felhasználót a metasploitnak. Ezen a linken olvashattok erről bővebben.

A program beszerzéséhez az alábbi parancsot használjuk:
[root@rogue ~]# svn checkout http://metasploit.com/svn/framework3/trunk/ msf3
...

Ha frissíteni szeretnénk a fejlesztői változatot, ezentúl elég ha belépünk az msf3 könyvtárba és az svn update parancsot használjuk.
Magát a programot az msf könyvtárból a ./msfconsole paranccsal indíthatjuk el. Továbbiakban majd írok arról is, hogyan használhatjuk az adatbázisunkat és az autopown funkciót a Metasploit Frameworkben.

Ajánlott irodalom:
http://blog.metasploit.com/2006/09/metasploit-30-automated-exploitation.html
https://bugs.launchpad.net/ubuntu/+source/ruby1.8/+bug/282302

#eof

FreeBSD + Postgresql

Néha szükségünk lehet egy jó adatbázis szerverre az alkalmazásainkhoz. Hát itt egy rövid leírás, FreeBSDn hogyan tudjuk ezt összehozni. Mint ahogy azt a cím is mondja, postgresql-t fogunk használni:

[root@rogue ~]# cd /usr/ports/databases/postgresql84-server/
[root@rogue /usr/ports/databases/postgresql84-server]# make install clean

...


Ha végzett a folyamat, indítsuk el, és állítsuk be a szerverünket:

[root@rogue ~]# echo "postgresql_enable=\"YES\"" >> /etc/rc.conf
[root@rogue ~]# /usr/local/etc/rc.d/postgresql initdb
...
[root@rogue ~]# /usr/local/etc/rc.d/postgresql start

Ezután mondjuk állítsunk be egy jelszót a pgsql usernek:

[root@rogue ~]# su pgsql
[pgsql@rogue /root]$ psql templat1
...
template1=#ALTER ROLE pgsql PASSWORD 'jelszoide';

ALTER ROLE
template1=# \q

[pgsql@rogue /root]$


Mostmár az azonosítást átállíthatjuk jelszavasra. A /usr/local/pgsql/data/pg_hba.conf-ot kell szerkesztenünk, hogy valami hasonló sorok legyenek a végén:

# "local" is for Unix domain socket connections only
local all all md5

# IPv4 local connections:
host all all 127.0.0.1/32 md5

# IPv6 local connections:

host all all ::1/128 md5
host all all 0.0.0.0/0 md5


Majd indítsuk újra az adatbázis szervert:

[root@rogue ~]# /usr/local/etc/rc.d/postgresql restart
...


Mostmár létrehozhatunk magunknak egy adatbázist és hozzá egy felhasználót:

[root@rogue ~]# su pgsql
[pgsql@rogue /root]$ createdb proba

Password:

[pgsql@rogue /root]$ createuser probauser -P

Enter password for new role:

Enter it again:

Shall the new role be a superuser? (y/n) n

Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

Password:

[pgsql@rogue /root]$ psql template1

Password:
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
...

template1=# GRANT ALL PRIVILEGES ON DATABASE proba to probauser;

GRANT

template1=# \q


Próbáljuk is ki az új felhasználónkat az adatbázisunkon:

[pgsql@rogue /root]$ psql -d proba -U probauser
Password for user probauser:

Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

...

proba=>


Remélem minden simán ment, és sikerült eljutni a végére :)

Ajánlott irodalom:
http://www.postgresql.org/docs/8.3/static/index.html

#eof

2009. május 21., csütörtök

FreeBSD + OpenVPN kliens

Pont ma futottam bele ebbe a problémába, hát nézzük, hogyan lehet összehozni egy openvpn kapcsolatot freebsd alatt.
Elsőre tegyük fel az openvpn-t:

[root@rogue ~]# cd /usr/ports/security/openvpn
[root@rogue /usr/ports/security/openvpn]# make install clean


Ez eltart egy kis ideig, de végeredményben szinte kész is vagyunk. Egyetlen probléma, hogy az openvpn indításkor nem rántja be automatikusan a tap device drivert, és csatlakozáskor csak egy hibaüzenetet kapunk. A megoldás egyszerű, kézzel kell betölteni a drivert:

[root@rogue ~]# kldload if_tap


Mostmár hiba nélkül tudunk csatlakozni a kliensünkkel például az egyetemi hálózatunkra, ha megvannak a szükséges fájljaink:

[root@rogue ~/nymevpn]# openvpn nyme.ovpn
Thu May 21 22:44:23 2009 OpenVPN 2.0.6 i386-portbld-freebsd7.2 [SSL] [LZO] built on May 21 2009
...
[root@rogue ~]# ifconfig tap0
tap0: flags=8843 metric 0 mtu 1500
ether 00:bd:cb:ca:24:00
inet 10.8.0.2 netmask 0xffffff00 broadcast 10.8.0.255


És kész is vagyunk.
Esetleg egy pár tipp: netstattal megnézhetjük, hogy vajon a default gatewayünknek is a vpn-es router került be. Ha igen ezt visszaállíthatjuk az eredetire (adott esetben 10.0.0.1):

[root@rogue ~]# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.8.0.1 UGS 0 0 tap0
172.16.4.0/24 10.8.0.1 UGS 0 0 tap0
...
[root@rogue ~]# route del default 10.8.0.1
del net default: gateway 10.8.0.1
[root@rogue ~]# route add default 10.0.0.1
add net default: gateway 10.0.0.1
[root@rogue ~]# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.1 UGS 0 0 em0
172.16.4.0/24 10.8.0.1 UGS 0 0 tap0


#eof

2009. május 16., szombat

Helló világ!

Itt fogom megpróbálni megörökíteni azokat a téma köröket, amikkel hálózati kalandozásaim során összefutok, és eddig nagyjából csak angol leírás létezik róluk. Ha lesz elég időm, talán ilyesmikről olvashattok:

Operációs rendszerek:
  • DD-WRT (samba, transmission, openwrt csomagok)
  • Debian Linux
  • FreeBSD
Hálózatok biztonságának tesztelése:
  • különböző mitm támadások (dsniff, ettercap)
  • ssl kapcsolatok megkerülése (sslstrip, tanúsítvány hamisítás)
  • metasploit
  • w3af
  • backtrack, samurai
és még ki tudja mi mindenre lesz időm...