Pratik OpenSSL Kullanımı

12:17 01.03.2009

Hemen her gün çeşitli işlerim için openssl’i kullanıyorum. Ara ara da arkadaşlardan bunu openssl’le nasil yaparim, openssl’in şu komutu ne işe yarardı gibisinden sorular aliyorum. Uzun zaman once bu konuda birseyler yazmistim ama usb diskimi Izmir’de kaybetmem sonrasi yayınlayamadım. Sonra tekrar hazırladım ve tekrar usb diskimi kaybettim. Pazar gunu biraz vakit bulunca hem egitim notlarina ekleyeceklerimi gozden gecirdim hem de bu konuda sık karşılaştığım soruları içeren openssl mini howto’sunu yazmaya oturdum. Eger yazı yayınlanırsa bilin ki bu sefer usb diskimi kaybetmedim:)

Yazı hazırlarken benim için  en zor bölümü giriş kısmıdır. Üzerine yazdığım konu ile ilgili temel ifadeleri yazmakta o kadar zorlanırım ki bazen sırf bunu aşamadığım için yazıyı bırakırım. Masaüstümde adı konulmuş içeriği doldurulmuş ama giriş bölümü hazırlanmamış onca belge var. bu sefer de aynı akibete ugramamak icin dogrudan icerige giriyorum. Temel seyleri merak edenler konu hakkında daha fazla bilgi bulabilecekleri arama motorlarına danışmalı.

Ilk Not: Openssl kullanarak aklınza gelebilecek her tür şifreleme/encoding(turkcesi ne ola ki?) ve tersi işlemler yapılabilir.

OpenSSL Yardım Menüsü

Openssl kullanımı aslında oldukça kolaydır fakat sunduğu seçenek sayısı fazla olduğu için genelde hangi paramnetrenin hangi sırada kullanılacağı şaşırılır. Bunun için openssl’in help özelliği kullanıabilir.

# openssl -h
openssl:Error: '-h' is an invalid command.
Standard commands
asn1parse      ca             ciphers        crl            crl2pkcs7
dgst           dh             dhparam        dsa            dsaparam
ec             ecparam        enc            engine         errstr
gendh          gendsa         genrsa         nseq           ocsp
passwd         pkcs12         pkcs7          pkcs8          prime
rand           req            rsa            rsautl         s_client
s_server       s_time         sess_id        smime          speed
spkac          verify         version        x509
Message Digest commands (see the `dgst' command for more details)
md2            md4            md5            rmd160         sha
sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc
aes-256-ecb    base64         bf             bf-cbc         bf-cfb
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb
des-ofb        des3           desx           rc2            rc2-40-cbc
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb
rc4            rc4-40

Buradan alt komutlara ait kullanım bilgisi için de openssl alt_komt -h parametresi kullanılır.

Mesela Openssl’in passwd altkomutunun kullanımı ile ilgili bilgi almak için

# openssl passwd -h
Usage: passwd [options] [passwords]
where options are
-crypt             standard Unix password algorithm (default)
-1                 MD5-based password algorithm
-apr1              MD5-based password algorithm, Apache variant
-salt string       use provided salt
-in file           read passwords from file
-stdin             read passwords from stdin
-noverify          never verify when reading password from terminal
-quiet             no warnings
-table             format output as table
-reverse           switch table columns

Base64 Encode/Decode İşlemleri

İçerisinde HuzeyfeOnal yazılı bir dosyanın base64 ile encoding yapılması sonucu oluşan çıktı.

[email protected]:~# openssl enc -base64 -in test -out test1
SHV6ZXlmZU9uYWwK

decoding için

openssl enc -d -base64 …

komutu kullanılır.

SSL üzerinden çalışan bir servise bağlanma

SSL/TLS üzerinden çalışmayan servislere kontrol amaçlı bağlanırken dogrudan telnet ip port ya da nc ip port komutlarını kullanırız fakat servis ssl çalıştırıyorsa bu iki bilinen  komut istediğimiz sonucu vermeyecektir. Bunun yerine Openssl ile birlitke gelen s_client parametresini kullanabiliriz.

# telnet vpn.lifeoverip.net 443
Trying 80.93.212.86...
Connected to vpn.lifeoverip.net.
Escape character is '^]'.
[email protected]:~# openssl s_client -connect www.lifeoverip.net:443
CONNECTED(00000003)
depth=0 /C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
verify return:1
---
Certificate chain
 0 s:/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
   i:/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDljCCAv+gAwIBAgIJAOZtLpQBRe+5MA0GCSqGSIb3DQEBBAUAMIGPMQswCQYD
VQQGEwJUUjERMA8GA1UECBMISXN0YW5idWwxEzARBgNVBAcTCkJhc2Frc2VoaXIx
EzARBgNVBAoTCkxpZmVvdmVyaXAxHDAaBgNVBAMTE21haWwubGlmZW92ZXJpcC5u
ZXQxJTAjBgkqhkiG9w0BCQEWFmh1emV5ZmVAbGlmZW92ZXJpcC5uZXQwHhcNMDgw
NDIwMTgzNzMxWhcNMTEwMTE1MTgzNzMxWjCBjzELMAkGA1UEBhMCVFIxETAPBgNV
BAgTCElzdGFuYnVsMRMwEQYDVQQHEwpCYXNha3NlaGlyMRMwEQYDVQQKEwpMaWZl
b3ZlcmlwMRwwGgYDVQQDExNtYWlsLmxpZmVvdmVyaXAubmV0MSUwIwYJKoZIhvcN
AQkBFhZodXpleWZlQGxpZmVvdmVyaXAubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQCqqYPSzpC1ldtTc4o1/iQqN18C89lZg4jHqRplppkwHRhyCW/6ua3S
ssUFPxm6rYVxjY+1hG13CHgJXhX22Agnr2PBicJrv1xvjWP571YZhVoof6UNpPDG
WUe/3J4mVOXD7J2KvsOcW4zoTOCZauE5z0oeUu+77glvqOiF2pu3LQIDAQABo4H3
MIH0MB0GA1UdDgQWBBSEhZEvLn4PMLo+UravLekmt+RL7zCBxAYDVR0jBIG8MIG5
gBSEhZEvLn4PMLo+UravLekmt+RL76GBlaSBkjCBjzELMAkGA1UEBhMCVFIxETAP
BgNVBAgTCElzdGFuYnVsMRMwEQYDVQQHEwpCYXNha3NlaGlyMRMwEQYDVQQKEwpM
aWZlb3ZlcmlwMRwwGgYDVQQDExNtYWlsLmxpZmVvdmVyaXAubmV0MSUwIwYJKoZI
hvcNAQkBFhZodXpleWZlQGxpZmVvdmVyaXAubmV0ggkA5m0ulAFF77kwDAYDVR0T
BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBttymnjSI8Q1WcwuJH6bpz0OyWEU6w
QCACvidVTbmtg9kWebXWolE9JDgp6n1tuU571qIu+HzkL8btsvBV2jl0JOmYmcFN
bH0nyElWOU9+je92O1JnGeARcB2n6OLnRFO4KrgeNeVZLtPX3uyu68BEWl4ub/tg
yMIXGPUwgSYnag==
-----END CERTIFICATE-----
subject=/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
issuer=/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/[email protected]
---
No client certificate CA names sent
---
SSL handshake has read 1486 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: DA3CB24F96F6843BD4C66E23F8862EFB3EFF61CC706C379A5ED75753C8D6B4DE
    Session-ID-ctx:
    Master-Key: BD2985CDA790CDDE2D2BA27C66EC8C0210F1BEAA31906A6760A1B2560C7F318BCF3039EF0894CB0198759968DFFEAF39
    Key-Arg   : None
    Start Time: 1235905711
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
GET / HTTP/1.1
Host:www.lifeoverip.net
HTTP/1.1 302 Found
Date: Sun, 01 Mar 2009 10:59:01 GMT
Server: Apache/5.2.0 (Fedora)
Location: src/login.php
Content-Length: 0
Content-Type: text/html

SSL Destekli Web Sunucu Simulasyonu

Openssl kullanarak SSL destekli bir web sunucu simulasyonu gerçekleştirebiliriz. Kullanıcılar belirttiğimiz adrese bağlanarak normal bir ssl sitesine bağlanmış gibi işlem yapabilirler. Openssl’le yapılacak bu tip bir çalışmada web sunucu dogrudan çalıştırıldığı dizini gösterecektir.

# openssl s_server -accept 444 -cert mycert.pem -WWW
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
bad gethostbyaddr
ACCEPT
bad gethostbyaddr
ACCEPT
bad gethostbyaddr
FILE:log/messages
ACCEPT

openssl_server <ekran görüntüsü>

Hash Fonksiyonlarını Kullanma

Openssl’inhangi hash fonksiyonlarını desteklediğini bulmak için openssl dgst -h komutu kullanılabilir.

...
-md5            to use the md5 message digest algorithm (default)
-md4            to use the md4 message digest algorithm
-md2            to use the md2 message digest algorithm
-sha1           to use the sha1 message digest algorithm
-sha            to use the sha message digest algorithm
-sha224         to use the sha224 message digest algorithm
-sha256         to use the sha256 message digest algorithm
-sha384         to use the sha384 message digest algorithm
-sha512         to use the sha512 message digest algorithm
-mdc2           to use the mdc2 message digest algorithm
-ripemd160      to use the ripemd160 message digest algorithm

Bir dosyanın hash’ini alma

Md5 için;

[email protected]:~# openssl dgst -md5 /etc/passwd
MD5(/etc/passwd)= 8edec48e1ba2784977bfd127474ce2c7

SHA512 için;

[email protected]:~# openssl dgst -sha512 /etc/passwd
SHA512(/etc/passwd)= cf7626685b2a31be1d43338a48740a1297a2837b4b7c3638eab8174300650136907a1961fe8063cd9657cd9c120e3a24cdd979b4ba42c4255fbf3a1d42c59786

Komut satırından herhangi bir stringin hash değerini bulmak için

~# echo "huzeyfe" |openssl dgst -md5
cc33aa30e69ff51055dd3fb12e148f35

Simetrik Şifreleme ile Dosya Güvenliği

Herhangi bir dosyayı des3 ile şifreleme

[email protected]:~# openssl enc -e -des3 -in /tmp/gizli_bilgi -out gizli_bilgi.des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:

yeni oluşturulan gizli_bilgi.des3 dosyasının içeriği okunmak istenirse anlamsız karekterler gözükecektir.

# more gizli_bilgi.des3
Salted__æÛéA´µt(?äÇ°EÆ!

Bu şekilde bir dosyayı şifreleyerek  kullanabilirsiniz.

Oluşturulan dosyanın içeriğinin binary yerine text(Ascii-Armour) olması istenirse -a parametresi kullanılmalıdır.

[email protected]:~# openssl enc -a -e -des3  -in /etc/hosts -out hosts.des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[email protected]:~# cat hosts.des3
U2FsdGVkX19F9/5/iH2jgjWlBCaw80hq2WsQ06KdKlimLdnXmoZLMTf9rtgwxM+L
oN7nqMwFycIiR/2+K0IL/wID8xzkuC/VcrMnf6xumHS8T955yVhkrj80t3lHvKBY
UTz0KsttNsgxN+X84b+VEg8YGwV8hks7nbDS/6c7lTD1XM9PhOTFTV7mEfM4vIaJ
LMVKU4g4jla0igLzCRkF+2K028f4cHixxlIE5ol1C0x9t3butjmztzHnVrMyddZz
SNXUCe/544epItIZtZWsaTBN4q/uRfZHwA/oo9b6tSP3LOwWvhmO7uuKfmMF8q3Q
iL3JeTpEpuZU3bIyFOU2FRJdKvCW+rEHRY/+gfJFSdE=

Şifreli dosyayı açmak için

#openssl enc -d -des3 -in gizli_bilgi.des3 -out gizli_bilgi

komutu kullanılır.

Linux/UNIX Sistemlerin Parola Güvenliği

UNIX/Linux sistemlerde kullanıcıların parola bilgileri /etc/shadow ya da /etc/master.passwd gibi dosyalarda şifrelenmiş olarak saklanır. Şifreleme için genelde kullanılan yöntem Md5 olmakla birlikte bazı dağıtımlar SHA256/512 kullanır. Linux/UNIX sistemlerde parolaların güvenliği sadece şifrelenmekle sağlanmaz, parolanın hash’ini ele geçiren birinin aynı zamanda bu şifrelemeyi karmaşıklaştırmak için kullanılan salt değerini ve tipini de ele geçirmesi gerekir.

Mesela aşağıdaki gibi bir bilgi saldırganın işine yaramaz

huzeyfe: mqTpXxm7ygQ9DD/pVIw7MLE444/PuNnAsRLy96SWJudCjvwQaD/.wPfA/AW7rnsRMkjeuIXFqP0RK0gEc6NFi

Sebebi ise bu hashlenmiş parola bilgisinin bruteforce ya da rainbowtable larla çözülebilmesi için bunu hashlemek için kullanılan algoritmaya ve salt değerine ihtiyaç duyulmasıdır.

Klasik bir UNIX/Linux Parola kontrol işlemi şu şekilde yapılır.

Kullanıcı parola bilgisini girer–>Sistem bu parola bilgisi için otomatik bir salt değeri üretir ve yapılan ayara göre MD5 ya da başka bir algoritma ile hash değerini alır base64 encoding işlemine sokar –>/etc/shadow’a yazar.

Aynı kullanıcı aynı parolayı bir kere daha girse sistemde oluşacak hash değeri farklı olacaktır.

huzeyfe:$6$rqPzY.iD$mqTpXxm7ygQ9DD/pVIw7MLE444/PuNnAsRLy96SWJudCjvwQaD/.wPfA/AW7rnsRMkjeuIXFqP0RK0gEc6NFi.:14304:0:99999:7:::
# passwd huzeyfe
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Her ikisi de aynı parola da aynı  olmasına rağmen yeni oluşan parola hash değeri  öncekinden farklı çıkacaktır.

huzeyfe:$6$YKT3ptRg$JJWYIM5XF184QneNMk9qJTaCt.ESMlt2rOYCdJsW1alUBdCbaLAiFl/Zy8tMedjXAfPkuZIoIe4BSHYg7.1Cg/:14304:0:99999:7:::

Bunun sebebi yeni bir şifre oluşturulurken seçilen salt değerlerinin farklı olmasıdır.

Parolanın hash değerindeki önemli alanlar

huzeyfe: kullanıcı ismi
$6$ parolanın SHA512 algoritması kullanılarak hashlendiği
$....$ Rastgele seçilen salt değeri.
JJWYIM5XF184QneNMk9qJTaCt.ESMlt2rOYCdJsW1alUBdCbaLAiFl/Zy8tMedjXAfPkuZIoIe4BSHYg7.1Cg  parolanın salt(tuz?) katılmış halinin hash değeri.

Openssl ile Linux/UNIX benzeri parolalar oluşturmak

Openssl’in passwd altkomutu ile md5, apr1 tipi algoritmalar kullanılarak oluşturulmuş  ve salt eklenmiş hash değerleri oluşturulabilir.

openssl passwd -1 -salt xyz  parola gibi.

Mesela passwd komutu kullanarak erhan kullanicisinin parolasini test1234 olarak degistirelim.

Sonra bu değişikliği shadow dosyasından okuyalım.

#passwd erhan
...
#grep erhan /etc/shadow
erhan:$1$vJbpReZd$/T7fZLwSquIMe.yLMsd9U/

Aynı değeri openssl passwd -1 komutu ile ede edebiliriz.

# openssl passwd -1 -salt vJbpReZd test1234
$1$vJbpReZd$/T7fZLwSquIMe.yLMsd9U/

Cisco IOS type 5   Parola Güvenliği

Cisco enable  parolası kaydedilirken Linux sistemlerdekine benzer mantık  işler bunun sebebi Cisco IOS’un FreeBSD şifreleme kütüphanesini kullanmasıdır. Aşağıdaki çıktı bize daha fazla fikir verecektir.

Router(config)#enable secret HL_R12

en parolasini HL_R12 yaptık sonra sistemde bunun nasıl gözüktüğüne bakalım.

Router#sh run | include secret
enable secret 5 $1$RK5L$05G045n5XVlENtyo04PBT1

görüleceği üzere Linux/UNIX sistemlerdekine benzer/aynı bir çıktı.

$1$ :Md5 kullanılmış
RK5L :Salt değeri
05G045n5XVlENtyo04PBT1: Hash değeri.

Salt değeri ve parolayı kullanarak aynı çıktıyı Openssl ile elde edebiliriz.

~# openssl passwd -1 -table -salt "RK5L" "HL_R12"
HL_R12  $1$RK5L$05G045n5XVlENtyo04PBT1

OpenSSL ile sertifika işlemleri vs için http://csirt.ulakbim.gov.tr/dokumanlar/ssl_sayisal_sertifikalar.pdf adresindeki yazı işinize yarayacaktır.

This entry was posted in Cisco, Encrytion, Linux Security, Security Tools. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

2 × three =