Zum Inhalt springen

Das schmuffligste Blog der Welt

Sinn und Unsinn der passiert

Archiv

Kategorie: Linux

Nachdem jetzt alle Domains mit den Zertifikaten von „Let’s Encrypt“ auf SSL laufen, habe ich auch mal das Blog auf HTTPS umgestellt.
Bei älteren Beiträgen kann u.U. noch angezeigt werden, dass einzelne Medien noch über HTTP geladen werden.
Da bin ich jetzt aber zu faul, das alles händisch zu ändern 🙂

Man hört allen Orten, dass mit dem Umstieg von XP zu Windows 7 die meisten Capisuite Faxclients für Windows nicht mehr laufen. Zu den bedeutenden Programm muss hier wohl „Lisa Fax“ gezählt werden. Kein Support mehr, nicht lauffähig unter Win 7.
Faxgate ist auch irgendwie nur ein Gebastel, mit Cups Druckertreiber und SSH Callback usw.

Nun will sich ja nun auch nicht jeder auch gleich eine VM installieren um die alten Faxclients laufen zu lassen.
Muss man ja auch nicht. Es geht doch ganz einfach!
Ganz simpel irgendwo ein Verzeichnis angelegt, dieses per Cronjob überwachen lassen und alle PDFs die dort gespeichert werden, werden als Fax in die Faxq eingereiht. Fertig.

#!/bin/bash

#pidfile
PID=/var/lock/sendfax.pid

#faxuser aus /etc/capisuite/fax.conf
users="user1 user2 user3"

#basedir für ausgehende faxe, ohne / am ende
faxbase=/some/dir/fax

#läuft das skript schon? dann ende.
if [[ -e $PID ]]
then
        exit
fi

for user in $users
do
    #alle pdf oder PDF im user dir finden
        faxes=$(find $faxbase/$user -maxdepth 1 -iname *.pdf)

    #was gefunden?
        if [[ $faxes != "" ]]
        then

                touch $PID
                echo "Found FAX for user $user, adding to faxq..."
                #max 20 faxe pro aufruf bearbeiten
                faxnum=1
                for fax in $faxes
        do
            #zielnummer=datei basename
                        target=$(basename $fax .pdf)
            
            #sonderzeichen entfernen
                        target=${target//[!0-9]/}
            
            #fax in die faxq einreihen
                        capisuitefax -q -u $user -d $target $fax

            #eingereihte faxe mit zeitstempel versehen und nach gesendet verschieben
                        mv $fax "$faxbase/$user/gesendet/$target-$(date +%Y%m%d-%H%M).pdf"

            #zähler hochzählen
                        faxnum=$(($faxnum+1))
                        if [[ $faxnum -ge 20 ]]
            then
                                exit 1
                        fi
                done
        
        #pid löschen
                rm $PID
        fi

done
exit 0

If somebody is looking for the alternative Firmware for the Linksys WAP54g accesspoint…

Here it is, HyperWAP 1.0c based on the original 3.04 Firmware

DOWNLOAD

Wer etwas stromparendes für einen Heimserver sucht, der sollte sich mal das Supermicro X10SBA anschauen.
Das Board ist passiv gekühlt und läuft mit der Intel Celeron J1900 CPU, hat also genug Leistung um ohne Probleme die beiden(!) Gbit LAN Ports oder auch die mSATA SSD zu „füttern“.

Ich habe das Board heute mit 2x 2GB DDR3L (wichtig, das Board läuft nur mit L Riegeln, also 1.35V), einer 64GB ADATA mSATA SSD und einer 3.5″ Festplatte in Betrieb genommen. Installiert ist natürlich Linux :).
Als Stromversorgung dient mir eine alte Pico-PSU80 mit ErP Netzteil.
Das Beste zum Schluss:

Im Idlemode, wenn die 3.5″ Platte schläft, hat der _gesamte_ Server einen Stromverbrauch von unter 14W. Wenn die 3.5″ Platte läuft und Daten liefert, dann liegt er bei unter 18W.

Some thoughts on DNS Amplification attacks as mentioned here for example:

http://dnsamplificationattacks.blogspot.de/2014/02/authoritative-name-server-attack.html

On several DNS servers I am responsible for, I have to deal with the exact same problem. Sadly I cannot just lock recursive clients out, as the server is used as primary DNS for customers. Limiting to an ACL does not help either, as the requests are coming from the allowed clients 🙁 Possible a lot of them are infected by malware. Using the rate limit feature of BIND is not helping here, because the queries are distributed across a lot of infected clients and this will not trigger the rate limits.

If you have a problem like this, you can see your DNS server opening a lot (hundreds, sometimes thousands) of connections to the victim DNS and flooding it with bogus A queries for random subdomains.
Using tcpdump this might look like this:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:26:08.502331 IP XXX.XXX.XXX.XXX.53961 > 114.114.116.135.53: 16075 A? ctefwvwherwd.gosky.chinacache.net. (51)
11:26:08.511161 IP XXX.XXX.XXX.XXX.48204 > 114.114.116.135.53: 59982 A? sfepcrmdwnczgp.gosky.chinacache.net. (53)
11:26:16.504011 IP XXX.XXX.XXX.XXX.64001 > 114.114.116.135.53: 16440 A? ctefwvwherwd.gosky.chinacache.net. (51)
11:26:16.513425 IP XXX.XXX.XXX.XXX.53530 > 114.114.116.135.53: 38553 A? sfepcrmdwnczgp.gosky.chinacache.net. (53)

How can you prevent this attack or soften it as much as possible? Good question, most people seem to manually search for the domain (in this example chinacache.net) and block it using the string-match feature in iptables.
I wrote a little script, that does the same thing, but can be run via CRON and blocks those queries automatically.

What does the script do?
1. It checks if there is an abnormally high number of open connections on port 53 to an IP adress (default: 50)
2. It then uses tcpdump to sample some (default: 10) packets of A? queries to that IP. If the number of queried domains exceeds a threshold (default: 10) of same domains+tld, it adds this domain+tld to a blacklist file (default: /etc/domain_blacklist)
3. It reads all entries of the blacklist file and converts the domain+tld to hex values and prepares and executes an iptables rule to block any queries for that domain

What you need?
iptables,  tcpdump, xxd, awk

The script was hacked quite quick and dirty, so you definetly can simplify some things or solve them much better. But this works for me at this time and I hope some of you will find use for it.
As usual, this comes without any warrany of any kind 🙂 Use at own risk!
If you have own iptables rules in usage, you might want to modify the script to not flush iptables every time it runs.
You could also remove the echo debug outputs or direct outputs to /dev/null (if using cron).

Download: dns.sh.gz
SEE UPDATED VERSION BELOW.

edit:

There are several Bugs in the script.
-threshold not correctly implemented

-what if in the 10 captured packets contain more than 1 different domain?

-maybe more 😀

edit:
The script has been running for about 20h now and so far it has blacklistet several domains from being queried:

chinacache.net
n876.com
9aq.com
bcai007.com
bddns.cn
ve60.com
google176.com
xp88888.com
sf120.com
765uc.com
sf120.com

Update 4.11.2014:
I changed the script a little.
-It is now possible to have domains whitelisted

-You can now choose to block the target(domain) or the source (IP) of the attack

So far everything works quite good for me.
Download updated version: dns.sh_1.gz

Für eine Alarmanlage habe ich mir bei Pollin die Relaiskarte K8io für den Parallelport bestellt. Nun gibt es leider für den Raspberry Pi keine USB->Paralleladapter, die diesen Namen auch verdienen, also musste gebastelt werden.
Da haben wir dann auch gleich das erste Problem, die parallele Schnittstelle arbeitet mit 5V high Pegeln, der Pi mit 3.3V TTL. Außerdem will ich die Karte mit 12V DC betreiben und nicht mit 9V AC. Wer hat sich denn das einfallen lassen? Wer hat denn irgendwo 9V AC liegen? 😀
Aber wo ein Wille ist, da ist ein Weg! Insofern muss man das Layout der K8io ein wenig modifzieren und dann geht auch das und zwar so:

-Vom Gleichrichter ersparen wir uns D2 und D4, da 12V DC Betrieb. Der + Pol ist dann außen und GND ist innen.
-Außerdem können wir mit dem Spannungsregler 7805 (12V DC -> 5V DC) nichts anfangen. Wir wollen nativ die 3.3V des Pi nutzen. Das spart auch schön Platz, es gibt keinen Kühlkörper mehr 🙂
Nachtrag: Wir erleichtern das Netzteil der K8io auch gleich noch um die beiden 100nf Kondensatoren, dann können wir aus den Resten (7805, Kühlkörper, 2x 100nF) eine kleine Wandlerplatine für den Pi bauen und alles mit 12V betreiben)
Nachtrag 2: Die o.g. Idee ist doch nicht so grandios wie zunächst vermutet. Der Raspi zieht doch recht ordentliche 0.5A max aus dem 7805. Bei 12V DC Betrieb sind das dann 3.5W Wärme Verlustleistung die an dem kleinen Sparkühlkörper verbraten werden müssen. Sprich: Das Teil wird recht heiss. Ich werde daher vermutlich auf ein kleines Schaltnetzteil umrüsten. Die haben idR einen wesentlich besseren Wirkungsgrad und verbraten nicht einfach in Wärme.
Nachtrag 3: Ich habe nun auf Basis des LM2576T-5.0 ein kleines Schaltnetzteil gebaut (u.A. hier vorgestellt). Die 150µH Drossel war nirgends zu bekommen, also musste mit dem ebenfalls dort vorgestellten Tool neu berechnet werden. Dies hat ergeben, dass ich auch eine 100µH Drossel verwenden kann, wenn ich den Kondensator anpasse.
Man merkt deutlich, dass nun der Gesamtaufbau wesentlich weniger Strom aufnimmt. Hatte ich vorher in der Spitze rund 500mA Stromaufnahme, so habe ich mit dem SNT nur noch max. 330mA Stromaufnahme! Und da ist noch ein kleiner NF-Verstärker hinzugekommen. Es lohnt sich also auf jeden Fall, den 7805 auszutauschen. Der Aufbau wird auch nur noch handwarm.

Soviel zu den techn. Änderungen! JP1 lassen wir drin, darüber kommen die 3.3V des Pi aufs Board. Es ginge zwar theoretisch auch ohne die Versorgung über JP1, und man hätte dann einen weiteren Eingang, aber sicher ist sicher.
Weitere Änderungen muss man eigentlich nicht vornehmen. Zu beachten ist, dass über die Pull Up Widerstände immer 3.3V an den Eingängen 1-4 anliegen.
Jetzt muss eigentlich nur noch ein passendes Adapterkabel gebastelt werden. Das geht am einfachsten mit einem 2×13 poligen Pfostenstecker, passendem Flachbandkabel und einem 25 poligen Sub-D Stecker mit Lötkelchen. Gibt es alles für ein paar EUR beim Trödler um die Ecke 😉

Hier ist die genaue Belegung für das Adapterkabel:

GPIO# PIN# Signal LPT PIN
2 3 Ctrl 1
3 5 Ctrl 14
4 7 Ctrl 16
14 8 Select1 10
15 10 Ctrl 17
17 11 Select2 11
18 12 Select3 12
27 13 Select4 13
22 15 Data1 2
23 16 Data2 3
24 18 Data3 4
10 19 Data4 5
9 21 Data5 6
11 23 Data6 7
25 22 Data7 8
8 24 Data8 9
7 26
1 3.3V 15
6 GND 18-25

Die erste Spalte bezeichnet den GPIO Signalname, die zweite Spalte den zugehörigen Pin auf dem Raspi Board (Achtung: Version 2!). Last not least die letzte Spalte die Pins auf dem Sub-D Stecker.

Hat man das dann alles ordentlich verlötet und auf Kurzschlüsse geprüft, kann man anstöpseln und sich mit den entsprechenden Tools austoben 🙂
Wer möchte, kann sich eine kleine Huckepackplatine für die K8io basteln und dann noch die brachliegenden Control Leitungen als weitere Eingänge oder Ausgänge nutzen. Ich habe mir da vier LEDs mit Vorwiderständen auf einen Platinenrest gelötet und realisiere damit Statusanzeigen.

Eingebaut in einem alten Gehäuse kann sich das sehen lassen 🙂


Ich liebe Telefonterror von Marketingtrotteln. Das spornt mich immer dazu an,  etwas an Capisuite herumzubasteln 🙂
Leider fehlt bei Capisuite eine out-of-the-box Blacklistfunktion zum sperren von übermittelten Rufnummern, aber dem kann abgeholfen werden.

Wie auch schon in meinem Beitrag hier erwähnt, kann man dies durch anpassen der incoming.py (wo die Datei liegt steht in der Regel in /etc/capisuite.conf) erreichen. Bei openSUSE liegt die Datei in /usr/lib64/capisuite.

Die Blacklist werten wir am besten in der Funktion callIncoming aus, und zwar NACH dem try/except Block:

# read config file and search for call_to in the user sections
try:
    config=cs_helpers.readConfig()
    userlist=config.sections()
[...]
except IOError,e:
    capisuite.error("Error occured during config file reading: "+e+" Disconnecting...")
    capisuite.reject(call,0x34A9)
    return

Das wäre besagter try/except Block. Hintendran fügen wir ein

if (call_from in (open("/etc/capisuite/blacklist.conf").read().split())):
   capisuite.log("call from blocked number "+call_from+". suppressed.",1,call)
   capisuite.reject(call,0x34A9)
   return

Nun fehlt natürlich noch unsere Liste mit geblockten Nummern, dazu erstellen wir ganz einfach eine Textdatei blacklist.conf im Capisuite ConfigDir /etc/capisuite. Jede Zeile enthält genau eine vollständige Telefonnummer.
Et voilá, betreffende Anrufe werden mit einem Capi Fehler rejected und der nervige Anrufer weiss nicht, wie im geschieht:

Thu Aug  9 10:22:07 2012 Connection 0xa9aed0: call from blocked number 069XXXXXXX. suppressed.

Hihihihi.

Some people want a recent libtorrent (in this case the 0.12.9 sources from openSUSE 12.1) patched with the no-upload-patch made public on

http://citylight.thinkbay.net/Disable_sharing_in_rtorrent

Here you go: libtorrent-0.12.9-no_upload.tar.gz

Just tar xvfz, ./configure, make and make install.

Careful: Disables upload for all aplications using libtorrent with all consequences (superseeding!)

 

 

Please scroll down for english version!

Gestern Abend hatte ich darüber nachgedacht, ob es mit dd irgendwie möglich ist, differentielle dumps zu erstellen.
Dabei sollen von einer Datei/einem Device nur die Blöcke in eine bestehende Datei/bestehendes Device geschrieben werden, die sich geändert haben. Hört sich kompliziert an, ist aber eigentlich ganz einfach:

Man macht einen Dump einer Festplatte mit dd. Dann einige Zeit später möchte man die Platte wieder dumpen ohne erneut das ganze File zu schreiben. Da wäre es praktisch, wenn man lediglich die Änderungen also quasi das Delta schreiben müsste.

Die kurze Version:
Es geht, hier ist das Skript. Bitte reinschauen und ggf. anpassen, das ist ganz schnell und dreckig runtergehackt.

Die lange Version:
Was das Skript macht ist erstmal die beiden Dateigrößen einzulesen. Die werden dann in K und M Blocks umgerechnet. Dann wird je ein Block der Quelle und des Ziels gelesen und die MD5 Summe erstellt. Unterscheiden sie sich, sind die Blöcke unterschiedlich, haben sich also geändert. Die Nummer des Blocks wird in einem Array gespeichert. Anschließend werden die unterschiedlichen Blöcke aus der Quelle gelesen und über skip/seek und notrunc in das Ziel geschrieben. Anschließen kann man sich die MD5 Summen von Quelle und Ziel berechnen lassen (optional).
Die ganze Aktion ist natürlich völliger Schwachsinn, weil man um die MD5 Summen der Blocks zu errechnen 1. die Quelle und 2. das Ziel komplett lesen muss. Das Ganze macht also nur Sinn, wenn man zwar rel. schnell lesen aber nur sehr langsam schreiben kann.

Zum Beispiel:
-Target liegt auf einem entfernten Rechner (Internet, WAN, etc. pp) und der entfernte Rechner hat hohen Upstream man selbst aber nur einen sehr geringen
-Source ist eine SSD die wesentlich schneller lesen als schreiben kann, sofern man on-the-fly auf das selbe Device schreibt

Aber es hat Spaß gemacht und vielleicht kann ja jemand etwas damit anfangen 😀

Wie gesagt, ist mit Vorsicht zu genießen und wie immer auf eigene Gefahr zu nutzen.

— english version —

Yesterday evening I thought about if it is possible with dd to make differential dumps.
Only changed blocks on a file/device should be written to the target. Sounds complicated but it is quite easy:

If you have a dump of a harddisk, for example, and some time later you want to do a new dump but without writing the whole disk again. Only the changed blocks should be written to the target file.

The short version:
It works, here is the script. Please look at it and modify to fit your needs, it is hacked very quick and dirty.

The long version:
What the script does, is first read the two file sizes and convert it to K and M blocks. Each block is then read from source and target and a MD5 sum is generated. If these two sums are different, then the block has changed. The number of the changed blocks is stored in an array and later the changed blocks are read from the source and written to the target with skip/seek and notrunc. Later you can calculate the MD5 sum of source and target (optional).
Of couse this is totally useless, because to calculate the MD5 sums of the blocks you both have to read the source AND the target file completely. This whole thing will only make sense if you can read very fast but only write very slow.

For example:
-Target lies on a remote machine (Internet, WAN, etc. pp) and the remote machine has a much higher upstream bandwith than your local machine
-Source is a SSD which can read much faster than it can write, if you read/write on the same device.

However, it was fun writing the script and maybe it is of use to someone.

Be careful, as always this comes without warranty and use at your own risk 😉

Wer kennt sie nicht, die täglichen/nächtlichen SPAM Faxe. Wenn man alles elektronisch über einen zentralen Faxserver kaufen lässt und die Faxe als PDF per Mail bekommt, hat man zwar keine Papierkosten, aber es nervt halt einfach.
Die Faxe kommen auch regelmäßig mit unterdrückter Rufnummer rein, damit man

a) keinen Nummernfilter setzen kann und
b) keine (triviale) Möglichkeit hat den Absender herauszufinden oder bei der Bundesnetzagentur Beschwerde einzulegen.

Da CapiSuite per default keine Möglichkeit bietet, anonyme Faxe abzulehnen, muss das entsprechende Python Skript händisch um diese Funktion erweitert werden. Bei openSUSE befindet sich dieses Skript unter

/usr/lib64/capisuite/incoming.py

Die betreffende Eingangsfunktion für die Faxe (faxIncoming) muss jetzt um ein IF Statement erweitert werden und sieht dann (Auszug) so aus:

def faxIncoming(call,call_from,call_to,curr_user,config,already_connected):
  try:
    udir=cs_helpers.getOption(config,"","fax_user_dir")
    if (udir==None):
      capisuite.error("global option fax_user_dir not found! -> rejecting call")
      capisuite.reject(call,0x34A9)
      return
    if (call_from=="-"):
      capisuite.log("call from empty number. suppressed.",1,call)
      capisuite.reject(call,0x34A9)
      return
    udir=os.path.join(udir,curr_user)+"/"

Praktischerweise setzt CapiSuite bei unbekannter Rufnummer diese auf „-„, so kann man mit dem o.g. IF Statement ganz einfach einen Capi Reject senden.  Man kann so nett sein und ein 0x3495 (Call Rejected) senden oder wie ich ein 0x34A9 (Temporary failure). Hier eine Liste der Capi Fehlercodes: Link

Wenn nun ein Fax mit unterdrückter Nummer hereinkommt, sieht man im Logfile was genau passiert:

0x8c8750: Connection object created for incoming call PLCI 401 from - to x CIP 0x4
0x8c8750: call from empty number. suppressed.
0x8c8750: rejecting with cause 34a9
0x8c8750: Connection object deleted

Da ich einen termporären Fehler zurückgebe, versucht es der Spammer dann noch ein paar dutzend mal, was die Leitung – eventuell – etwas ausbremst und er nicht so viele SPAM Faxe verschicken kann wie sonst 😉

Hier das diff File für alle Schreibfaulen als tar.gz: incoming.py.tar.gz