Det Àr ingen hemlighet att internet Àr en vÀldigt fiendtliga miljö. SÄ snart du startar en server utsÀtts den omedelbart för massiva attacker och flera skanningar. Ett exempel Àr som kan ge en uppfattning om omfattningen av denna skrÀptrafik. Faktum Àr att pÄ en genomsnittlig server kan 99% av trafiken vara skadlig.
Tarpit Àr en portfÀlla som anvÀnds för att sakta ner inkommande anslutningar. Om ett externt system ansluter till denna port, kan det inte snabbt stÀnga anslutningen. Det mÄste anvÀnda sina systemresurser och vÀnta pÄ att anslutningen avbryts pÄ grund av tidsgrÀns, eller manuellt bryta den.
Tarpits anvÀnds oftast för skydd. Tekniken utvecklades ursprungligen för att skydda mot datormaskar. Nu kan den anvÀndas för att göra livet surt för spammare och forskare som sysslar med bred skanning av alla IP-adresser i följd (exempel pÄ Habr): , ).
En av systemadministratörerna, vid namn Kris Vellons, tyckte uppenbarligen att han hade tröttnat pĂ„ detta elĂ€nde â och han skrev ett litet program , en tarpit för SSH som saktar ner inkommande anslutningar. Programmet öppnar en port (standard för testning Ă€r port 2222) och lĂ„tsas vara en SSH-server, men i verkligheten upprĂ€ttar det en oĂ€ndlig anslutning med den inkommande klienten, tills den ger upp. Detta kan pĂ„gĂ„ i flera dagar eller lĂ€ngre, tills klienten slutar.
Installation av verktyget:
$ make
$ ./endlessh &
$ ssh -p2222 localhostEn vÀl implementerad tarpit kommer att ta mer resurser frÄn angriparen Àn frÄn er. Men det handlar inte ens om resurser. Författaren , att programmet skapar en beroendeframkallande effekt. Just nu finns 27 klienter i hans fÀlla, och nÄgra av dem har varit anslutna i flera veckor. Vid högnivÄaktivitet satt 1378 klienter i fÀllan under 20 timmar!
I driftlÀge mÄste servern Endlessh installeras pÄ standardport 22, dit mÄnga brottslingar ansluter. Standard sÀkra rekommendationer föreslÄr alltid att flytta SSH till en annan port, vilket omedelbart minskar loggstorleken med en storleksordning.
Kris Vellons sÀger att hans program utnyttjar ett stycke ur specifikationen för SSH-protokollet. Omedelbart efter att TCP-anslutningen har upprÀttats, men innan kryptografi anvÀnds, mÄste bÄda parter skicka en identifieringsstrÀng. Och dÀr finns Àven en notering: «Servern KAN skicka andra datalinjer innan den skickar versionlinjen». Och inga begrÀnsningar för mÀngden av dessa data, varje rad mÄste börja med SSH-.
Det Àr just detta programmet Endlessh gör: det skickar oÀndlig ström av slumpmÀssigt genererade data, som följer RFC 4253, det vill sÀga sÀnda före identifiering, och varje rad börjar med SSH- och överstiger inte 255 tecken, inklusive radslutstecken. Allt enligt standard.
Som standard vÀntar programmet 10 sekunder mellan paketsÀndningar. Detta förhindrar tidsavbrott, sÄ att klienten kommer vara fast för alltid.
Eftersom data skickas innan kryptografi anvÀnds, Àr programmet extremt enkelt. Det krÀver ingen integrering av nÄgra krypteringar och stöd för mÄnga protokoll.
Författaren har strÀvat efter att verktyget ska konsumera minimalt med resurser och arbeta helt osynligt pÄ maskinen. Till skillnad frÄn moderna antivirusprogram och andra "sÀkerhetssystem" bör det inte bromsa datorn. Han lyckades minimera bÄde trafik och minnesanvÀndning genom en nÄgot mer intrikat programimplementering. Om han bara hade kört en separat process för varje ny anslutning, skulle potentiella angripare kunna genomföra en DDoS-attack genom att öppna mÄnga anslutningar för att höja resursanvÀndningen pÄ maskinen. En ström per anslutning Àr inte heller det bÀsta alternativet, eftersom kÀrnan skulle spendera resurser pÄ att hantera trÄdarna.
DÀrför valde Chris Vellons den lÀttaste versionen för Endlessh: en entrÄdad server poll(2), dÀr klienterna i fÄngenskap praktiskt taget inte konsumerar extra resurser, förutom socket-objektet i kÀrnan och ytterligare 78 byte för övervakning i Endlessh. För att inte allokera mottagnings- och sÀndningsbuffrar för varje klient, öppnar Endlessh en direktÄtkomstsocket och sÀnder TCP-paket direkt, och ignorerar nÀstan hela TCP/IP-stacken i operativsystemet. Den inkommande bufferten behövs egentligen inte, eftersom inkommande data inte intresserar oss.
Författaren sÀger att han vid tidpunkten för sitt program om existensen av Python asycio och andra trappar. Om han hade kÀnt till asycio, skulle han ha kunnat implementera sitt verktyg med bara 18 rader kod i Python:
import asyncio
import random
async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % random.randint(0, 2**32))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 2222)
async with server:
await server.serve_forever()
asyncio.run(main())Asyncio Àr perfekt för att skriva tarpits. Till exempel kan en sÄdan fÀlla hÀnga Firefox, Chrome eller en annan klient i flera timmar som försöker ansluta till din HTTP-server:
import asyncio
import random
async def handler(_reader, writer):
writer.write(b'HTTP/1.1 200 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (header, value))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 8080)
async with server:
await server.serve_forever()
asyncio.run(main())En tarpit Ă€r ett utmĂ€rkt verktyg för att straffa internetvettar. Det finns dock en viss risk för att det istĂ€llet drar till sig deras uppmĂ€rksamhet för att ett specifikt servers beteende Ă€r ovanligt. NĂ„gon och rikta en DDoS-attack mot din IP. Ăven om det hittills inte har förekommit sĂ„dana fall, fungerar tarpits utmĂ€rkt.
Kategorier:
Python, InformationssÀkerhet, Programvara, Systemadministration
Taggar:
SSH, Endlessh, tarpit, fÀlla, asyncio
FÀlla (tar pit) för inkommande SSH-anslutningar
Det Àr ingen hemlighet att internet Àr en vÀldigt fiendtliga miljö. SÄ snart du startar en server utsÀtts den omedelbart för massiva attacker och flera skanningar. Ett exempel Àr som kan ge en uppfattning om omfattningen av denna skrÀptrafik. Faktum Àr att pÄ en genomsnittlig server kan 99% av trafiken vara skadlig.
Tarpit Àr en portfÀlla som anvÀnds för att sakta ner inkommande anslutningar. Om ett externt system ansluter till denna port, kan det inte snabbt stÀnga anslutningen. Det mÄste anvÀnda sina systemresurser och vÀnta pÄ att anslutningen avbryts pÄ grund av tidsgrÀns, eller manuellt bryta den.
Tarpits anvÀnds oftast för skydd. Tekniken utvecklades ursprungligen för att skydda mot datormaskar. Nu kan den anvÀndas för att göra livet surt för spammare och forskare som sysslar med bred skanning av alla IP-adresser i följd (exempel pÄ Habr): , ).
En av systemadministratörerna, vid namn Kris Vellons, tyckte uppenbarligen att han hade tröttnat pĂ„ detta elĂ€nde â och han skrev ett litet program , en tarpit för SSH som saktar ner inkommande anslutningar. Programmet öppnar en port (standard för testning Ă€r port 2222) och lĂ„tsas vara en SSH-server, men i verkligheten upprĂ€ttar det en oĂ€ndlig anslutning med den inkommande klienten, tills den ger upp. Detta kan pĂ„gĂ„ i flera dagar eller lĂ€ngre, tills klienten slutar.
Installation av verktyget:
$ make
$ ./endlessh &
$ ssh -p2222 localhostEn vÀl implementerad tarpit kommer att ta mer resurser frÄn angriparen Àn frÄn er. Men det handlar inte ens om resurser. Författaren , att programmet skapar en beroendeframkallande effekt. Just nu finns 27 klienter i hans fÀlla, och nÄgra av dem har varit anslutna i flera veckor. Vid högnivÄaktivitet satt 1378 klienter i fÀllan under 20 timmar!
I driftlÀge mÄste servern Endlessh installeras pÄ standardport 22, dit mÄnga brottslingar ansluter. Standard sÀkra rekommendationer föreslÄr alltid att flytta SSH till en annan port, vilket omedelbart minskar loggstorleken med en storleksordning.
Kris Vellons sÀger att hans program utnyttjar ett stycke ur specifikationen för SSH-protokollet. Omedelbart efter att TCP-anslutningen har upprÀttats, men innan kryptografi anvÀnds, mÄste bÄda parter skicka en identifieringsstrÀng. Och dÀr finns Àven en notering: «Servern KAN skicka andra datalinjer innan den skickar versionlinjen». Och inga begrÀnsningar för mÀngden av dessa data, varje rad mÄste börja med SSH-.
Det Àr just detta programmet Endlessh gör: det skickar oÀndlig ström av slumpmÀssigt genererade data, som följer RFC 4253, det vill sÀga sÀnda före identifiering, och varje rad börjar med SSH- och överstiger inte 255 tecken, inklusive radslutstecken. Allt enligt standard.
Som standard vÀntar programmet 10 sekunder mellan paketsÀndningar. Detta förhindrar tidsavbrott, sÄ att klienten kommer vara fast för alltid.
Eftersom data skickas innan kryptografi anvÀnds, Àr programmet extremt enkelt. Det krÀver ingen integrering av nÄgra krypteringar och stöd för mÄnga protokoll.
Författaren har strÀvat efter att verktyget ska konsumera minimalt med resurser och arbeta helt osynligt pÄ maskinen. Till skillnad frÄn moderna antivirusprogram och andra "sÀkerhetssystem" bör det inte bromsa datorn. Han lyckades minimera bÄde trafik och minnesanvÀndning genom en nÄgot mer intrikat programimplementering. Om han bara hade kört en separat process för varje ny anslutning, skulle potentiella angripare kunna genomföra en DDoS-attack genom att öppna mÄnga anslutningar för att höja resursanvÀndningen pÄ maskinen. En ström per anslutning Àr inte heller det bÀsta alternativet, eftersom kÀrnan skulle spendera resurser pÄ att hantera trÄdarna.
DÀrför valde Chris Vellons den lÀttaste versionen för Endlessh: en entrÄdad server poll(2), dÀr klienterna i fÄngenskap praktiskt taget inte konsumerar extra resurser, förutom socket-objektet i kÀrnan och ytterligare 78 byte för övervakning i Endlessh. För att inte allokera mottagnings- och sÀndningsbuffrar för varje klient, öppnar Endlessh en direktÄtkomstsocket och sÀnder TCP-paket direkt, och ignorerar nÀstan hela TCP/IP-stacken i operativsystemet. Den inkommande bufferten behövs egentligen inte, eftersom inkommande data inte intresserar oss.
Författaren sÀger att han vid tidpunkten för sitt program om existensen av Python asycio och andra trappar. Om han hade kÀnt till asycio, skulle han ha kunnat implementera sitt verktyg med bara 18 rader kod i Python:
import asyncio
import random
async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % random.randint(0, 2**32))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 2222)
async with server:
await server.serve_forever()
asyncio.run(main())Asyncio Àr perfekt för att skriva tarpits. Till exempel kan en sÄdan fÀlla hÀnga Firefox, Chrome eller en annan klient i flera timmar som försöker ansluta till din HTTP-server:
import asyncio
import random
async def handler(_reader, writer):
writer.write(b'HTTP/1.1 200 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (header, value))
await writer.drain()
except ConnectionResetError:
pass
async def main():
server = await asyncio.start_server(handler, '0.0.0.0', 8080)
async with server:
await server.serve_forever()
asyncio.run(main())En tarpit Ă€r ett utmĂ€rkt verktyg för att straffa internetvettar. Det finns dock en viss risk för att det istĂ€llet drar till sig deras uppmĂ€rksamhet för att ett specifikt servers beteende Ă€r ovanligt. NĂ„gon och rikta en DDoS-attack mot din IP. Ăven om det hittills inte har förekommit sĂ„dana fall, fungerar tarpits utmĂ€rkt.
KĂ€lla: habr.com
