UDPTunnel – enviar els paquets UDP per sobre d’enllaços TCP
Una altre d’aquelles eines que malgrat ser petitones i rares poden servir per fer mil i una coses. Per exemple, connectar a un servidor DNS a través d’un port TCP en una xarxa on el tràfic UDP estigui tancat.
UDPTunnel és una eina molt simple d’usar i la seva sintaxis és molt autoexplicativa:
udptunnel -s TCP-port [-r] [-v] UDP-addr/UDP-port[/ttl]
udptunnel -c TCP-addr[/TCP-port] [-r] [-v] UDP-addr/UDP-port[/ttl]
és interessant fixar-se que el mateix executable pot ser usat com a servidor o com a client, així doncs ideal per construir els dos costats de l’enllaç de forma simple.
A més si ho combinem amb httptunnel podem passar per sobre de proxies de forma senzilla.
Podcast 2×04: SSH avançat
El podcast
[display_podcast]
Notes sobre el podcast
- -L: connecta per SSH a un HOST Un cop allà obre una connexió TCP a un altre HOST:PORT i obre un port TCP local que al connectar-hi ens envia al HOST:PORT anteriors, o sigui, portforwarding.
- -L [bind_address:]port:host:hostport]
- -W: connecta per SSH a un HOST un cop allà obre una connexió TCP a un altre HOST:PORT i ens retorna a la stdin/stdout el contingut d’aquest darrer enllaç TCP
- -W host:hostport
- -R publicar un port: connecta per SSH a un host i un cop allà publica un port TCP, quan un client es connecta a aquest port TCP accedeix per SSH a la màquina que ha llença l’enllaç SSH i obre un altre enllaç TCP a una altre IP:PORT.
- -R[bind_address:]port:host:hostport
- -D socks5: connecta per SSH a un HOST i després publica un port SOCKS5/TCP, és a dir, que podem connectar a aquest port local i sortir a internet a través de la IP del HOST on hem connectat per SSH
- -D [bind_address:]port
- -w tunel: connecta per SSH a un HOST i el socket que s’ha usat per fer l’enllaç SSH es connecta a dues interficies de tipus TUN, una a cada extrem del socket. Així doncs, si configurem les corresponents IPs a les interficies TUN tenim un tunel/VPN montada entre els extrems.
- -w local_tun[:remote_tun]
HPN-SSH
La web de: HPN-SSH -> especialment interessant: Dynamic Windows and None Cipher
- treballa amb mida de finestra dinàmica
- treballa sense xifrat quan un enllaç no té terminal associat, sovint usat per pas de fitxers
Les proves:
- Openssh 5.3p1 + hpn-13 (només el patch: Dynamic Windows and None Cipher)
- després d’aplicar el patch: openssh5.3-dynwindow_noneswitch.diff.gz
- modifiquem el fitxer: sshconnect2.c
<br><pre>linia: 366<br>- if (!tty_flag) /* no null on tty sessions */<br>+ if (1) /* no null on tty sessions */</pre><br>
així podem fer SSH sense xifrar només després d’haver fet el login.
exemple ampla de banada d’un SSH amb xifrat aes128-ctr, usant finestra dinàmica:
scp -v -oNoneEnabled=no -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh
o
ssh -v -oNoneEnabled=no -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null
velocitat de transferència: <strong>13.7MB/s</strong>
- debug ciphers, una única negociació de ciphers:
debug1: AUTH STATE IS 0
debug1: REQUESTED ENC.NAME is '<strong>aes128-ctr</strong>'
debug1: kex: server-><strong>client</strong> aes128-ctr hmac-md5 none
debug1: REQUESTED ENC.NAME is '<strong>aes128-ctr</strong>'
debug1: kex: client-><strong>server</strong> aes128-ctr hmac-md5 none
exemple sense xifrat, usant finestra dinàmica:
scp -v -oNoneEnabled=yes -oNoneSwitch=yes fitxer root@127.0.0.1:/tmp/ssh
o
ssh -v -oNoneEnabled=yes -oNoneSwitch=yes root@127.0.0.1 "dd if=/dev/zero"|pv > /dev/null
velocitat de transferència: <strong>37.4MB/s</strong>
- abans del pass de login:
debug1: <strong>AUTH</strong> STATE IS <strong>0</strong>
debug1: REQUESTED ENC.NAME is '<strong>aes128-ctr</strong>'
debug1: kex: server-><strong>client</strong> aes128-ctr hmac-md5 none
debug1: REQUESTED ENC.NAME is '<strong>aes128-ctr</strong>'
debug1: kex: client-><strong>server</strong> aes128-ctr hmac-md5 none
- després d’autenticar-se:
debug1: <strong>AUTH</strong> STATE IS <strong>1</strong>
debug1: REQUESTED ENC.NAME is '<strong>none</strong>'
debug1: Requesting NONE. Authflag is 1
debug1: None requested post authentication.
debug1: kex: server-><strong>client</strong> none hmac-md5 none
debug1: REQUESTED ENC.NAME is '<strong>none</strong>'
debug1: Requesting NONE. Authflag is 1
debug1: None requested post authentication.
debug1: kex: client-><strong>server</strong> none hmac-md5 none
Podcast 2×03: eines per jugar amb SOCKS5
Finalment l’última entrega de la trilogia de podcasts sobre SOCKS. Com indica el títol i podeu veure amb els links aquest parla d’eines per montar servidors SOCKS i wrappers per montar clients SOCKS5.
El podcast:
[display_podcast]
Referències:
- Apunts per fer el podcast: fitxer .txt amb les meves notes per fer el podcast, mig en català i anglès.
- Servidors:
- Clients/Wrappers/Proxifiers:
- tsocks
- csocks
- connect-proxy
- proxychains
- SocksiPy (python)
- ICP (Internet Cache Protocol)
Podcast 2×02: SOCKS5 Bytestreams (XEP-0065)
La segona part sobre la trilogia de SOCKS5.
El podcast:
[display_podcast]
Exemples extrets del XEP-0065:
Example 1. Initiator Sends Service Discovery Request to Target
<iq type='get' from='initiator@example.com/foo' to='target@example.org/bar' id='hello'> <query xmlns='http://jabber.org/protocol/disco#info'/> </iq>
Example 2. Target Replies to Service Discovery Request
<iq type='result' from='target@example.org/bar' to='initiator@example.com/foo' id='hello'> <query xmlns='http://jabber.org/protocol/disco#info'> <identity category='proxy' type='bytestreams' name='SOCKS5 Bytestreams Service'/> <feature var='http://jabber.org/protocol/bytestreams'/> </query> </iq>
Example 3. Initiator Sends Service Discovery Request to Server
<iq type='get' from='initiator@example.com/foo' to='example.com' id='server_items'> <query xmlns='http://jabber.org/protocol/disco#items'/> </iq>
Example 4. Server Replies to Service Discovery Request
<iq type='result' from='example.com' to='initiator@example.com/foo' id='server_items'> <query xmlns='http://jabber.org/protocol/disco#items'> <item jid='streamhostproxy.example.net' name='Bytestreams Proxy'/> </query> </iq>
Example 5. Initiator Sends Service Discovery Request to Proxy
<iq type='get' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='proxy_info'> <query xmlns='http://jabber.org/protocol/disco#info'/> </iq>
Example 6. Server Replies to Service Discovery Request
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='proxy_info'> <query xmlns='http://jabber.org/protocol/disco#info'> <identity category='proxy' type='bytestreams' name='SOCKS5 Bytestreams Service'/> <feature var='http://jabber.org/protocol/bytestreams'/> </query> </iq>
Example 7. Initiator Requests Network Address from Proxy
<iq type='get' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> </iq>
Example 8. Proxy Informs Initiator of Network Address
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams'> sid='vxf9n471bn46'> <streamhost jid='streamhostproxy.example.net' host='24.24.24.1' p zeroconf='_jabber.bytestreams'/> </query> </iq>
Example 9. Proxy Returns Error to Initiator
<iq type='error' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> <error code='403' type='auth'> <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 10. Proxy Returns Error to Initiator
<iq type='error' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='discover'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'/> <error code='405' type='cancel'> <not-allowed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 11. Initiation of Interaction
<iq type='set' from='initiator@example.com/foo' to='target@example.org/bar' id='initiate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46' mode='tcp'> <streamhost jid='initiator@example.com/foo' host='192.168.4.1' port='5086'/> <streamhost jid='streamhostproxy.example.net' host='24.24.24.1' zeroconf='_jabber.bytestreams'/> </query> </iq>
Example 12. Target Refuses Bytestream
<iq type='error' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <error code='406' type='auth'> <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 13. Target Is Unable to Connect to Any StreamHost and Wishes to End Transaction
<iq type='error' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <error code='404' type='cancel'> <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Example 16. Target Notifies Initiator of Connection
<iq type='result' from='target@example.org/bar' to='initiator@example.com/foo' id='initiate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'> <streamhost-used jid='streamhostproxy.example.net'/> </query> </iq>
Example 19. Initiator Requests Activation of Bytestream
<iq type='set' from='initiator@example.com/foo' to='streamhostproxy.example.net' id='activate'> <query xmlns='http://jabber.org/protocol/bytestreams' sid='vxf9n471bn46'> <activate>target@example.org/bar</activate> </query> </iq>
Example 20. Proxy Informs Initiator of Activation
<iq type='result' from='streamhostproxy.example.net' to='initiator@example.com/foo' id='activate'/>
Referències:
- Apunts per fer el podcast: fitxer .txt amb la llista de coses que volia comentar al podcast és una barreja de català, castellà i anglès.
- RFC i XEPs:
- RFC1928: SOCKS Protocol v5
- XEP-0065: SOCKS5 Bytestream
- XEP-0030: Service Discovery
- Extencions del XMPP: tots els XEPs
from=’initiator@example.com/foo’
to=’target@example.org/bar’
id=’hello’>
<query xmlns=’http://jabber.org/protocol/disco#info’/>
</iq>
reDuh: TCP sobre HTTP
La idea es força simple es tracta de transportar un fluxe TCP sobre d’una connexió HTTP convencional, fiexeu-vos que en aquest cas no estem parlant de proxies ni similars. Sinó de paquets TCP+HTTP que en la part de dades del HTTP tornen a implementar TCP, si fessim un petit esquema seria algo així:
+----+----+------+------+-----+------+ |... | IP | TCP | HTTP | TCP | DATA | +----+----+------+------+-----+------+
Si realment teniu aquest interés montar reDuh és realment senzill, de fet, suporta servidors amb JSP, PHP i ASP. En escència l’únic que fa és usar aquests protocols per re-obrir una connexió TCP. Així doncs, al servidor on montem aquesta eina hem de tenir certs privilegis per poder obrir sockets des d’un script.
L’eina no és massa recomanable si pensem tenir fluxes de dades molt intensos, per exemple, senssions VNC. Però funciona prou bé si el que volem és transportar una sessió SSH o similar.
Terminals via Web (CLI via Web)
UPDATE 2017/1/18: I just discovered Wetty which is by far the best option that I found to have a Web Terminal completely easy to use and compatible with Linux terminals. I highly recommend it.
En l’article sobre Turnkey Linux vaig parlar sobre shellinabox, doncs bé per coses de l’atzar he descobert que no és l’únic sistema que preten donar accés a una sessió de shell a través d’una pàgina web.
De fet, les tres eines que he trobat són realment bones, així doncs si algú en sap alguna cosa més sobre elles que m’ho digui perquè no sé amb quina quedar-me:
- shellinabox: emula un terminal VT100 i es llença com un dimoni que dona accés al host local a través del port que escollim, pot treballar amb o sense SSL.
- ANYTerm: també suporta SSL però treballa a través d’Apache recolzant-se amb mod_proxy.
- AJAXTerm: inspirat en ANYTerm però molt més simple d’instal·lar, ja que només depèn de python, o sigui, que treballa com a dimoni en el sistema on volem tenir la shell.