29 Ocak 2020 Çarşamba

lsb_release komutu

Giriş
Açıklaması şöyle.
/usr/bin/lsb_release is a Python script.
-a seçeneği - all
Açıklaması şöyle.
The /etc/lsb-release file defines environmental variables with the same information provided by the lsb_release -a command:
Bu dosya şöyledir
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
Örnek
Şöyle yaparız.
# lsb_release -a
LSB Version:    core-9.20170808ubuntu1-noarch:security-9.20170808ubuntu1-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic
-c seçeneği - Codenane
Codename'i döndürür.
Örnek
Şöyle yaparız.
lsb_release -c
Çıktı olarak şunu alırız
Codename:   xenial
-r seçeneği
Release değerini döndürür.
Örnek
Şöyle yaparız.
Var=$(lsb_release -r)
echo "$Var"
Örnek
Release ve Codename değerlerini almak için şöyle yaparız.
$ lsb_release -rc
Release:    16.04
Codename:   xenial
-s seçeneği
Açıklaması şöyle.
-s   show requested information in short format
-r   show release number of this distribution
-d   show description of this distribution
Örnek
Şöyle yaparız.
lsb_release -sr
-s seçeneği kullanıldığı için çıktı olarak şunu alırız.
18.04


19 Ocak 2020 Pazar

tcpdump komutu

Giriş
tcpdump aracı Wireshark veya tshark kadar gelişmiş değil. Ancak çoğu Linux'ta kurulu geldiği için öğrenmekte fayda var. 

İsminden sadece tcp trafiğinin analiz edilebildiği sanılmasın, udp ve icmp trafiğini de gösterebiliyor. Hatta tcpdump ile "-e" seçeneği kullanılarak Layer 2 MAC adreslerini görmek bile mümkün.

tcpdump Alternatifleri
1. Wireshark
2. tshark
3. iptables ile loglama
3. Raw Sockets ile loglama
4. PF_RING ile loglama
5. pcap ile loglama  

ip6 seçeneği
Şöyle yaparız.
tcpdump -ni eth3 ip6 -s0
-c seçeneği
Kaç tane paketi işledikten sonra durması gerektiğini belirtir.
Örnek
50 paketi yakalamak için şöyle yaparız.
tcpdump -s0 -i wlan0 -C 50 -w /path/to/ capture-$(date +%a-%d%m%y-%H%M-%S).pcap
dst seçeneği
Hedef ip ve port numarasını görmek için şöyle yaparız.
tcpdump -i eth0 dst port 6005
-e seçeneği
MAC zarfını da yakalar. Şöyle yaparız.
tcpdump -e -i eth0
-ether seçeneği
Belli bir mac adresine göre filtreleme yapabilmeyi
Örnek
Şöyle yaparız
sudo tcpdump ether host aa:bb:cc:11:22:33
-i seçeneği - interface
Kullanılması istenilen arayüzü belirtir.
Örnek
eth0'daki paketleri yakalayıp dosyaya yazmak için şöyle yaparız. -s ile snaplen tanımlanır. 0 verilirse 65535 byte anlamına gelir.
tcpdump -s0 -i eth0 -w eth0_traffic.pcap
-n
Açıklaması şöyle. IP adresini rakam olarak gösterir.
-n  Don’t convert host addresses to names.  This can be used to avoid DNS lookups.
-nn
Açıklaması şöyle
-nn Don’t convert protocol and port numbers etc. to names either.
Örnek
Şöyle yaparız
# tcpdump -nn 'icmp and (src a.b.0.1 or dst a.b.0.1)'
-p seçeneği
Açıklaması şöyle. Gösterilmesi istenen protocol belirtilir
Packet capture utilities can trivially put the network device into promiscuous mode, which is to say that the device accepts everything it receives. In fact, this is usually the default: with tcpdump, you have to specify the -p option in order to not do it.
host seçeneği
Örnek
Şöyle yaparız
tcpdump -i lo -nnvvv host 192.168.1.100 and port 8000
port seçeneği
Ağ arayüzü belirtmezsek default arayüz kullanır. Şöyle yaparız.
tcpdump port 80
Ağ arayüzü ile kullanmak için şöyle yaparız.
tcpdump -i eth0 port 80
udp seçeneği
Şöyle yaparız
tcpdump udp port 53
src seçeneği
Source alanı belirtilen IP olan paketleri yakalamak için şöyle yaparız.
tcpdump -n src host 192.168.1.m2 -w network.pcap
-t seçeneği
tcpdump çıktısından timestamp görmek istemiyorsak -t kullanırız.

-v seçeneği
Çıktının verbose olmasını sağlar.

-vv seçeneği
Çıktının daha da verbose olmasını sağlar. Şöyle yaparız.
tcpdump -nnvvXSs 1514 -i <interface> port 80 -w output.pcap.
-w seçeneği - write
Belirtilen dosyaya yazar.  
Örnek
Şöyle yaparız
tcpdump  -i eth0 'port 443' -vvv -w network.cap
Örnek
Şöyle yaparız
$ tcpdump tcp ‘port 443 or port 80’ -w out-file
-X seçeneği
Gelen paketlerin sadece header alanını değil, içini de gösterir. Açıklaması şöyle
-X When parsing and printing, in addition to printing the headers of each packet, print the data of each packet (minus its link level header).
filtre  Örnekleri
Önce Berkeley Packet Filter (BPF) açıklamasına bakalım
What is BPF?

BPF (or more commonly, the extended version, eBPF) is a language that was originally used exclusively for filtering packets, but it is capable of quite a lot more. On Linux, it can be used for many other things, including system call filters for security, and performance monitoring, as you pointed out. While Windows did add eBPF support, that is not what Windows' perfmon utility uses. Windows only added support for compatibility with non-Windows utilities that rely on OS support for eBPF.

The eBPF programs are not executed in userspace. Instead, the application creates and sends an eBPF program to the kernel, which executes it. It is actually machine code for a virtual processor that is implemented in the form of an interpreter in the kernel, although it can also use JIT compilation to enhance performance considerably. The program has access to some basic interfaces in the kernel, including those related to performance and networking. The eBPF program then communicates with the kernel to provide it the computational results (such as dropping a packet).
BPF bazı kısıtlamalar ile geliyor. Açıklaması şöyle
Restrictions on eBPF programs

In order to protect from denial-of-service attacks or accidental crashes, the kernel first verifies the code before it is compiled. Before being run, the code is subject to several important checks:

  • The program consists of no more than 4096 instructions in total.
  • Backwards jumps cannot occur, with the exception of bounded loops.
  • There are no instructions that are always unreachable.
The upshot is that the verifier must be able to prove that the eBPF program halts. It hasn't found a solution to the halting problem, of course, which is why it only accepts programs that it knows will halt. To do this, it represents the program as a directed acyclic graph. In addition to this, it tries to prevent information leaks and out-of-bounds memory access. The verifier thus further ensures:

  • Pointer comparison cannot be performed.
  • Pointer arithmetic can only be done with a scalar (a value not derived from a pointer).
  • No pointer arithmetic results in a pointer outside of its designated memory space.
Pointers cannot be stored or returned as a value, so the eBPF program is "blind" to them.

The verifier is rather complex and does far more, although it has itself been the source of serious security bugs, at least when the bpf(2) syscall is not disabled for unprivileged users.
BPF kodunu görmek için -d seçeneği kullanılır. Şöyle yaparız
# tcpdump -i eth0 "dst host 192.168.1.0" -d
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 4
(002) ld       [30]
(003) jeq      #0xc0a80100      jt 8    jf 9
(004) jeq      #0x806           jt 6    jf 5
(005) jeq      #0x8035          jt 6    jf 9
(006) ld       [38]
(007) jeq      #0xc0a80100      jt 8    jf 9
(008) ret      #262144
(009) ret      #0
Örnek
Şöyle yaparız.
tcpdump -i eth0 "dst host 192.168.1.0"
Örnek
Şöyle yaparız.
tcpdump -i eno1 -v "icmp or arp"
Örnek
udp ve ip alanlarına göre filtrelemek için şöyle yaparız.
tcpdump -i tun1001 "(udp[2:2]==3784) and ip[9] &255==17 and ((udp[8] &0x1f)>0)"
 -vvv -s 0 -XX
Örnek
Şöyle yaparız.
tcpdump -i eth0 'tcp[13] & 16!=0'

16 Ocak 2020 Perşembe

mktemp komutu

-d seçeneği
Örnek
Şöyle yaparız
dir=$(mktemp -d)
Örnek
Açıklaması şöyle.
The mktemp -d command will create a directory at the given path, with the X-es at the end of the pathname replaced by random alphanumeric characters. It will return the pathname of the directory that was created, and we store this value in tmpdir.
Şöyle yaparız.
tmpdir=$(mktemp -d "$PWD"/tmp.XXXXXXXX)   # using ./tmp.XXXXXXXX would work too

12 Ocak 2020 Pazar

head komutu

-n seçeneği
Kaç tane satırın gösterileceğini belirtir.
Örnek
Şöyle yaparız.
for file in ./*.csv; do
  head -n 200 "$file" >"$file.200"
done

9 Ocak 2020 Perşembe

bash kodlama $$ gömülü değişkeni - process id of script

Giriş
Bu gömülü değişken ile BASHPID benzerler.

Örnek
Şöyle yaparız. Burada bash'in kendi ID'sini echo'ya parametre olarak geçiyoruz.
echo $$
10062
ps -ef | grep bash
mhawke   10062 10056  0 10:48 pts/0    00:00:00 bash
Örnek
Açıklaması şöyle.
Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the invoking shell, not the subshell.
Elimizde şöyle bir kod olsun. subshell yine aynı process tarafından çalıştırıldığı için aynı process id numarasını görürüz.
echo $$
# Output : 3911
true | while true; do
    eval 'echo $$'
    break
done
# Output : 3911

5 Ocak 2020 Pazar

UFW - The Uncomplicated Firewall

Giriş
UFW mesajlarını dmesg ile görebiliriz. Şöyle yaparız.
[22661.447946] [UFW BLOCK] IN=eth0 OUT= MAC=ee:54:32:37:94:5f:f0:4b:3a:4f:80:30:08:00
 SRC=35.162.106.154 DST=104.248.41.4 LEN=40 TOS=0x00 PREC=0x00 TTL=37 ID=52549 DF
PROTO=TCP SPT=25 DPT=50616 WINDOW=0 RES=0x00 RST URGP=0
insert
Örnek
Açıklaması şöyle.
UFW rules are checked in sequence. The first rule that matches source and destination applies and remaining rules are ignored.

When you use a plain ufw deny the rule is added after the others (use ufw status to list the rules in order). If the soruce address matches an allow or limit line above your deny (and there is likely one), that allow/limit line applies and you rule is not checked.

To make sure your rule appears first, do:
Kurala sıra vermek için şöyle yaparız.
ufw insert 1 deny from 78.128.113.58/24 to any 
status
Örnek
Şöyle yaparız
$ sudo ufw status
Status: active

To                 Action      From
--                 ------      ----
22                 ALLOW       Anywhere
9200               DENY        Anywhere
6379/tcp           ALLOW       Anywhere
22 (v6)            ALLOW       Anywhere (v6)
9200 (v6)          DENY        Anywhere (v6)
6379/tcp (v6)      ALLOW       Anywhere (v6)

2 Ocak 2020 Perşembe

tar komutu

Giriş
Farklı tar araçları, farklı seçenekler sunabiliyor.

stdin'den okumak
Komutun sonuna "-" karakterini koyarız.

Örnek
Şöyle yaparız. wget -O 'dan sonra gelen "-" karakteri ile stdout'a yazar. tar' da "-" karakter ile stdin'den okur
wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
stdout'a yazmak
Komutun sonuna "-" karakterini koyarız.
Örnek
Şöyle yaparız. Sıkıştırılan dosya stdout'a yazılır. Karşı makineye gönderilir ve stdin'inden okunarak açılır.
$ tar -zcf - -C /path/to/files . | ssh user@host "tar -zx - -C /path/to/destination"
--absolute-names seçeneği
Açıklaması şöyle.
By default, GNU tar drops a leading / on input or output, and complains about file names containing a .. component. There is an option that turns off this behavior:
--absolute-names
-P
Do not strip leading slashes from file names, and permit file names containing a .. file name component.
-b seçeneği
tar komutu ile Sıkıştırma yazısına taşıdım.

-c seçeneği

tar komutu ile Sıkıştırma yazısına taşıdım.

-C seçeneği
tar komutu ile Sıkıştırma yazısına bakabilirsiniz.

Açıklaması şöyle. Dosya açma için kullanıyorsak açmadan önce change directory yapılacak yeri belirtir.
-C, --directory=DIR
Change to DIR before performing any operations. This option is order-sensitive, i.e. it affects all options that follow.
Örnek
Şöyle yaparız.
tar -xzf file.gz -C /opt/jdk
--concatenate seçeneği
İki tane sıkıştırılmamış tar dosyasını birleştirir. Eğer dosya sıkıştırılmış ise hata verir.
Örnek
Hatayı görmek için şöyle yaparız.
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
--exclude seçeneği
tar komutu ile Sıkıştırma yazısına taşıdım.

-f seçeneği
Kullanılacak dosya ismini belirtir.

-j seçeneği (bzip)
bzip dosyası ile çalışılacağını belirtir. bzip dosyasını açmak için şöyle yaparız
tar xjf file.tar.bz2
-H seçeneği
tar komutu ile Sıkıştırma yazısına taşıdım.

-ignore-zeros seçeneği
Bazen tar dosyalarında EOF yani tar'ın bittiğini belirten işaret yanlış yerde oluyor. Bunu aşmak için şöyle yaparız.
## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
--lzip seçeneği (lzip)
lzip dosyalarını işlemek içindir. Şöyle yaparız.
tar -cvf --lzip /media/my-usb/result.lz /tmp/source-dir
--no-same-owner seçeneği
tar içerdiği dosyaların sahipliğini de saklar. tar dosyasını açarken bu bilgilerin kullanılmamasını sağlar.

--no-same-permissions seçeneği
tar içerdiği dosyaların sahipliğini de saklar. tar dosyasını açarken bu bilgilerin kullanılmamasını sağlar.

-p seçeneği
tar komutu ile Sıkıştırma yazısına taşıdım.

-t seçeneği
Tar dosyasının içini görmek için kullanılır.
Örnek
Elimizde şöyle bir tgaz dosyası olsun
- folder
    - subdir1
      - file1.txt
      - file2.text
    - subdir2
      - file1.txt
Şöyle yaparız.
tar -tf folder.tgz
Çıktı olarak şunu alırız
folder/
folder/subdir1/
folder/subdir1/file1.txt
folder/subdir1/file2.txt
folder/subdir2/
folder/subdir2/file1.txt
Örnek
Şöyle yaparız.
## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b
Örnek
Dosyadaki grup/kullanıcı bilgisini görmek için şöyle yaparız.
tar tvf thetarball.tgz | awk '{print $2}' | sort -u
-x seçeneği - Extract
Extract anlamına gelir. Açmak için kullanılır.
Örnek
Açıklaması şöyle. Eğer z seçeneğini sağlamazsak tar açma işleminde dosya tipini uzantıya bakarak anlar.
If you leave out -z from options tar will guess archive type by the file .ext:
Şöyle yaparız
tar -xf multiview_action.tgz
Örnek
Şöyle yaparız. zcat komutu parçalanmış dosyaları birleştirir ve açar, daha sonra tar komutuna geçer. tar komutunda -z veya -f seçeneğini kullanmaya gerek yok.
zcat multiview_action.tgz.part-* | tar -x
Örnek
Şöyle yaparız.
tar -xvf file.tar.gz
Örnek
tar içerdiği dosyaların sahipliğini de saklar. Elimizde 502 numaralı kullanıcıya ait bir dosya içeren şöyle bir tar olsun. Bu dosyayı açınca sistemde 502 numaralı kullanıcı yoksa şöyle bir çıktı alırız.
[root@rocks7 common]# ls -l
-rw-r--r-- 1 root root 4779534 May  2  2012 scalapack-2.0.2.tgz
[root@rocks7 common]# tar xf scalapack-2.0.2.tgz
[root@rocks7 common]# 
[root@rocks7 common]# ls -l
total 98576
drwxr-xr-x 10  502 games     4096 May  2  2012 scalapack-2.0.2
-rw-r--r--  1 root root   4779534 May  2  2012 scalapack-2.0.2.tgz
-v seçeneği
Verbose anlamına gelir. Daha detaylı çıktı verir.
Örnek
Açma esnasında dosyaları görmek için şöyle yapılır
tar xzvf file.tar.gz
-z seçeneği (gzip)
gzip ile sıkıştırır veya gzip ile açar.

Örnek
gzip dosyası ile çalışılacağını belirtir. gzip oluşturmak için şöyle yaparız
tar -czf file.tar.gz .
gzip dosyasını açmak için şöyle yaparız
tar -xzf file.tar.gz .