Nav noslēpums, ka internets ir ļoti vardarbīga vide. Tiklīdz jūs uzsākat serveri, tas acumirklī tiek pakļauts masveida uzbrukumiem un daudziem skenēšanas mēģinājumiem. Piemērs ir , kas ļauj novērtēt šī atkritumu trafika apmērus. Patiesībā vidējā serverī 99% trafika var būt kaitīgs.
Tarpits ir porta slazds, ko izmanto ienākošo savienojumu palēnināšanai. Ja trešā puse pieslēdzas šim portam, ātri izslēgt savienojumu neizdosies. Tai vajadzēs tērēt savus sistēmas resursus un gaidīt, kamēr savienojums tiks pārtraukts pēc laika ierobežojuma, vai manuāli to pārtraukt.
Visbiežāk tarpiti tiek izmantoti aizsardzībai. Šī tehnika pirmo reizi tika izstrādāta, lai aizsargātu pret datoru tārpiem. Pašlaik to var izmantot, lai sarežģītu dzīvi surogātpasta sūtītājiem un pētītājiem, kas plaši skenē visus IP adreses (piemēri uz Хабре: , ).
Vienam no sistēmas administratoriem vārdā Kriss Velons, iespējams, apnicis vērot šo nekārtību - un viņš uzrakstīja mazu programmu , tarpits SSH, kas palēnina ienākošos savienojumus. Programme atver portu (noklusējumā testēšanai norādīts ports 2222) un izlikties par SSH serveri, bet patiesībā izveido bezgalīgu savienojumu ar ienākošo klientu, kamēr tas nepadodas. Tas var turpināties vairākas dienas vai ilgāk, līdz klients atslēgsies.
Uztīšanas rīka uzstādīšana:
$ make
$ ./endlessh &
$ ssh -p2222 localhostPareizi ieviests tarpits atņems uzbrucējam vairāk resursu nekā jums. Bet runa nav tikai par resursiem. Autors , ka programma rada atkarību. Tieši tagad viņa slazdā ir 27 klienti, daži no viņiem pieslēgušies vairākas nedēļas. Aktivitātes kulminācijā slazdā uzturējās 1378 klienti 20 stundu laikā!
Izmantošanas laikā Endlessh serveri jāuzstāda parastajā portā 22, kur masveidā uzbrūk huligāni. Standarta drošības ieteikumi vienmēr iesaka pārvietot SSH uz citu portu, kas ievērojami samazina žurnālu apjomu.
Kriss Velons saka, ka viņa programma izmanto vienu rindkopu no spesifikācijas par SSH protokolu. Tikko pēc TCP savienojuma izveides, bet pirms šifrēšanas lietošanas abām pusēm jānosūta identifikācijas virknes. Un turpat piezīme: «Server VAR varētu nosūtīt citus datu virknes pirms versijas virknes nosūtīšanas». Un nav ierobežojumu šiem datiem, vienkārši katra virkne jāuzsāk ar SSH-.
Tieši ar to nodarbojas programma Endlessh: tā nosūta bezgalīgu nejauši ģenerētu datu plūsmu, kas atbilst RFC 4253, tas ir, nosūtīšana pirms identifikācijas, un katra virkne sākas ar SSH- un nepārsniedz 255 simbolus, ieskaitot rindiņas beigu simbolu. Kopumā viss pēc standarta.
Pēc noklusējuma programma gaida 10 sekundes starp pakotņu nosūtīšanu. Tas novērš atvienošanu laika ierobežojuma dēļ, tādējādi klients var palikt iesprostots ilgstoši.
Tā kā datu nosūtīšana notiek pirms kriptogrāfijas pielietošanas, programma ir ārkārtīgi vienkārša. Tajā nav nepieciešams ieviest nekādus šifrējumus un atbalstīt daudzus protokolus.
Autors ir centies, lai rīks patērētu minimālas resursus un darbotos absolūti nemanāmi uz datora. Atšķirībā no mūsdienu antivīrusiem un citiem «drošības sistēmām», tam nevajadzētu palēnināt datoru. Viņam izdevās minimizēt gan trafiku, gan atmiņas patēriņu ar nedaudz izsmalcinātāku programmatūras realizāciju. Ja viņš vienkārši palaistu atsevišķu procesu uz jaunu savienojumu, potenciālie ļaunprātīgie lietotāji varētu veikt DDoS uzbrukumu, atverot daudzus savienojumus, lai izsīktu resursus uz datora. Pa vienai plūsmai uz savienojumu — arī nav labākais variants, jo kodols iztērēs resursus plūsmu pārvaldīšanai.
Tāpēc Kriss Velons izvēlējās Endlessh visvieglāko variantu: vienas plūsmas serveri poll(2), kur klienti iesprostā praktiski patērē liekus resursus, neieskaitot saskarni kodolā un vēl 78 baitus uzraudzībai Endlessh. Lai neradītu saņemšanas un nosūtīšanas buferus katram klientam, Endlessh atver tieša piekļuves saskarni un tieši pārraida TCP pakotnes, ignorējot gandrīz visu TCP/IP operētājsistēmas steku. Ienākošais buferis vispār nav nepieciešams, jo ienākošie dati mūs neinteresē.
Autors saka, ka programmas izstrādes laikā par Python asycio un citiem traucējumiem. Ja viņš būtu zinājis par asycio, tad savu utilītu varētu realizēt tikai 18 rindiņās 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 ir ideāli piemērots tarpitīrakstu rakstīšanai. Piemēram, šāds tarpit var uz dūšīgiem stundām padarīt Firefox, Chrome vai citu klientu, kas mēģina savienoties ar jūsu HTTP serveri, neizlāpjoties:
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())Tarpit ir lieliska ierīce, lai sodītu interneta huligānus. Patiesībā ir zināms risks tieši piesaistīt viņu uzmanību ar konkrēta servera neparasto uzvedību. Kāds un mērķtiecīgu DDoS uzbrukumu jūsu IP. Tomēr līdz šim nav bijušas šādas situācijas, un tarpit labi darbojas.
Hubi:
Python, Informācijas drošība, Softs, Sistemātiskā administrācija
Mērķi:
SSH, Endlessh, tarpit, tarpit, slazds, asyncio
Slazds (tarpits) ienākošajiem SSH savienojumiem
Nav noslēpums, ka internets ir ļoti vardarbīga vide. Tiklīdz jūs uzsākat serveri, tas acumirklī tiek pakļauts masveida uzbrukumiem un daudziem skenēšanas mēģinājumiem. Piemērs ir , kas ļauj novērtēt šī atkritumu trafika apmērus. Patiesībā vidējā serverī 99% trafika var būt kaitīgs.
Tarpits ir porta slazds, ko izmanto ienākošo savienojumu palēnināšanai. Ja trešā puse pieslēdzas šim portam, ātri izslēgt savienojumu neizdosies. Tai vajadzēs tērēt savus sistēmas resursus un gaidīt, kamēr savienojums tiks pārtraukts pēc laika ierobežojuma, vai manuāli to pārtraukt.
Visbiežāk tarpiti tiek izmantoti aizsardzībai. Šī tehnika pirmo reizi tika izstrādāta, lai aizsargātu pret datoru tārpiem. Pašlaik to var izmantot, lai sarežģītu dzīvi surogātpasta sūtītājiem un pētītājiem, kas plaši skenē visus IP adreses (piemēri uz Хабре: , ).
Vienam no sistēmas administratoriem vārdā Kriss Velons, iespējams, apnicis vērot šo nekārtību - un viņš uzrakstīja mazu programmu , tarpits SSH, kas palēnina ienākošos savienojumus. Programme atver portu (noklusējumā testēšanai norādīts ports 2222) un izlikties par SSH serveri, bet patiesībā izveido bezgalīgu savienojumu ar ienākošo klientu, kamēr tas nepadodas. Tas var turpināties vairākas dienas vai ilgāk, līdz klients atslēgsies.
Uztīšanas rīka uzstādīšana:
$ make
$ ./endlessh &
$ ssh -p2222 localhostPareizi ieviests tarpits atņems uzbrucējam vairāk resursu nekā jums. Bet runa nav tikai par resursiem. Autors , ka programma rada atkarību. Tieši tagad viņa slazdā ir 27 klienti, daži no viņiem pieslēgušies vairākas nedēļas. Aktivitātes kulminācijā slazdā uzturējās 1378 klienti 20 stundu laikā!
Izmantošanas laikā Endlessh serveri jāuzstāda parastajā portā 22, kur masveidā uzbrūk huligāni. Standarta drošības ieteikumi vienmēr iesaka pārvietot SSH uz citu portu, kas ievērojami samazina žurnālu apjomu.
Kriss Velons saka, ka viņa programma izmanto vienu rindkopu no spesifikācijas par SSH protokolu. Tikko pēc TCP savienojuma izveides, bet pirms šifrēšanas lietošanas abām pusēm jānosūta identifikācijas virknes. Un turpat piezīme: «Server VAR varētu nosūtīt citus datu virknes pirms versijas virknes nosūtīšanas». Un nav ierobežojumu šiem datiem, vienkārši katra virkne jāuzsāk ar SSH-.
Tieši ar to nodarbojas programma Endlessh: tā nosūta bezgalīgu nejauši ģenerētu datu plūsmu, kas atbilst RFC 4253, tas ir, nosūtīšana pirms identifikācijas, un katra virkne sākas ar SSH- un nepārsniedz 255 simbolus, ieskaitot rindiņas beigu simbolu. Kopumā viss pēc standarta.
Pēc noklusējuma programma gaida 10 sekundes starp pakotņu nosūtīšanu. Tas novērš atvienošanu laika ierobežojuma dēļ, tādējādi klients var palikt iesprostots ilgstoši.
Tā kā datu nosūtīšana notiek pirms kriptogrāfijas pielietošanas, programma ir ārkārtīgi vienkārša. Tajā nav nepieciešams ieviest nekādus šifrējumus un atbalstīt daudzus protokolus.
Autors ir centies, lai rīks patērētu minimālas resursus un darbotos absolūti nemanāmi uz datora. Atšķirībā no mūsdienu antivīrusiem un citiem «drošības sistēmām», tam nevajadzētu palēnināt datoru. Viņam izdevās minimizēt gan trafiku, gan atmiņas patēriņu ar nedaudz izsmalcinātāku programmatūras realizāciju. Ja viņš vienkārši palaistu atsevišķu procesu uz jaunu savienojumu, potenciālie ļaunprātīgie lietotāji varētu veikt DDoS uzbrukumu, atverot daudzus savienojumus, lai izsīktu resursus uz datora. Pa vienai plūsmai uz savienojumu — arī nav labākais variants, jo kodols iztērēs resursus plūsmu pārvaldīšanai.
Tāpēc Kriss Velons izvēlējās Endlessh visvieglāko variantu: vienas plūsmas serveri poll(2), kur klienti iesprostā praktiski patērē liekus resursus, neieskaitot saskarni kodolā un vēl 78 baitus uzraudzībai Endlessh. Lai neradītu saņemšanas un nosūtīšanas buferus katram klientam, Endlessh atver tieša piekļuves saskarni un tieši pārraida TCP pakotnes, ignorējot gandrīz visu TCP/IP operētājsistēmas steku. Ienākošais buferis vispār nav nepieciešams, jo ienākošie dati mūs neinteresē.
Autors saka, ka programmas izstrādes laikā par Python asycio un citiem traucējumiem. Ja viņš būtu zinājis par asycio, tad savu utilītu varētu realizēt tikai 18 rindiņās 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 ir ideāli piemērots tarpitīrakstu rakstīšanai. Piemēram, šāds tarpit var uz dūšīgiem stundām padarīt Firefox, Chrome vai citu klientu, kas mēģina savienoties ar jūsu HTTP serveri, neizlāpjoties:
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())Tarpit ir lieliska ierīce, lai sodītu interneta huligānus. Patiesībā ir zināms risks tieši piesaistīt viņu uzmanību ar konkrēta servera neparasto uzvedību. Kāds un mērķtiecīgu DDoS uzbrukumu jūsu IP. Tomēr līdz šim nav bijušas šādas situācijas, un tarpit labi darbojas.
Avots: habr.com
