Wednesday, September 7, 2016

Animated Gifs -- Bash Alias

alias gifthis='_(){ (($#<1)) && echo "Usage: <output file> [glob frag (default:.png)] [delay (default:120)]" && return; convert -delay ${3:-120} -loop 0 *${2:-.png} "${1}";};_' 

Thursday, August 25, 2016

Bash Parent/Child Pipe Inheritance Exploit

#!/bin/bash 
ipaddr=${1}
rdlnk=$(readlink /proc/$$/fd/0)
user="" 
passwd=""   
function get_input() {
 if grep -Eq "^pipe:|deleted" <<< "${rdlnk}" || [[ -p "${rdlnk}" ]]; then 
  while IFS= read -r piped_input || break; do 
  [[ -z "${ipaddr}" ]] && ipaddr="${piped_input}" && continue
  [[ -z "${user}" ]]   && user="${piped_input}"   && continue
  [[ -z "${passwd}" ]] && passwd="${piped_input}" && continue  
  done  
 fi 
 echo "Got that IP address you gave me to work on: ${ipaddr}" 
 [[ -n "${user}" ]] && echo "[... and that user: ${user}]" 
 [[ -n "${user}" ]] && echo "[... and that users password: ${passwd}]" 
}
get_input 
exit 0
Normally it's fine:
$> process_ip.bsh 71.123.123.3
Got that IP address you gave me to work on: 71.123.123.3

But, put the parent into a piped loop and watch out:
$ echo -en "71.123.123.3\nroot\ntoor\n" | while read a; do echo "Parent loop, processing: ${a}"; grep -q '^[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' <<< "${a}" && ./process_ip.bsh "$a"; done
Parent loop, processing: 71.123.123.3
Got that IP address you gave me to work on: 71.123.123.3
[... and that user: root]
[... and that users password: toor]

Ouch. The parent only wanted to provide the IP Address from its pipe to the child. Presuming that the parent must maintain an open pipe with sensitive data in it at the time of the fork to the child process. How can this be prevented? Unfortunately, inheriting a parents fd's is a POSIX standard that is not easily moved. The best way to handle this is to provide yet another pipe on fd0 from the parent, since the most recent will be the one dup'd. E.g. ./process_ip.bsh "$a" < /dev/null

Thursday, July 14, 2016

Renaming files to crtime on Ext4

 ## Dates are of a format: FILE_20160612.txt yet the date portion is wrong 
 ## it should reflect the creation date of the file. The creation date needs 
 ## to be grabbed from Ext4 (pre-xstat) and the file moved to the proper file
 ## name. See the next blog entry for lscrtime. 
while read a; do 
 fcrdt=$(lscrtime "${a}" | date -d"$(awk '$1="";1')" +%Y%m%d)
 fprefix="$(sed 's/_.*$//' <<< "$a")"
 mv "${a}" "${fprefix}_${fcrdt}.txt"
done < <(find . -type f) 

Thursday, June 30, 2016

lscrtime -- Get crtime ext4 Creation Timestamp

 Get the creation time, from ext4 using debugfs. To use just enter a regex that matches the files/directories in the cwd that you want to display. If you have multiple files with the same extension yet only want one, simply complete the regex with a $.
E.g. If these files are in the cwd: file_1 file_10 file_10000
  To get the creation time of file10:
   $> lscrtime file_10$
 To list the creation time of all three:
   $> lscrtime file_1 (if no other files are in the directory)
      -- or -- (more specifically)
   $> lscrtime 'file_1[0]{0,5}$'
alias lscrtime='_() { local fs="";while IFS=" " read -d "" a b; do fs=$(df "${b:-.}"|tail -1|sed "s/ .*$//");crtime="$(sudo debugfs -R "stat <${a}>" "${fs}" 2>"${DISCARD_DEV}"|grep crtime|sed "s/.*-- //")"; echo "${b} ${crtime}"; done < <(find . -maxdepth 1 -regextype posix-extended -regex "^(./)*${1}.*" -printf "%i %f\0");};_' 

Saturday, June 18, 2016

Removing Duplicate Files

#!/usr/bin/env bash 

old_var="zzz"
var="xxx"
[ -n "${1}" ] && CMD="echo Dryrun: "
while read a; do 
var="$(basename "${a}")"
[ "${var}" == "${old_var}" ] && ${CMD} rm -v "${a}" || old_var="${var}"
done < <(find . -type f | rev | sort -t'/' -k 1 | rev) 
Note: This uses names only, to make it robust add md5sums.

Sunday, April 17, 2016

Recursive Factorial in bc!

alias factorial='_() { var=${1}; echo -en "scale=25;\ndefine f (x) {if (x <= 1) return (1);\nreturn (f(x-1) * x);}\nf(${var})\nquit" | bc;};_' 
Logic found on the bc man page. Note the newlines, bc is a bit finicky about newlines when dealing with functions on one-liners otherwise.

Tuesday, April 5, 2016

Printing key-value pairs from Bash Associative array

#!/bin/bash 

 ## Printing key-value pairs from a Bash associative array 
unset myarr && declare -A myarr 
let myarr["eightytwo"]+=8
let myarr["eightytwo"]+=74
myarr["thirteen"]+=1
myarr["thirteen"]+=3
let myarr["fiftythree"]+=48
let myarr["fiftythree"]+=5
for a in "${!myarr[@]}"; do echo "${a}: ${myarr["$a"]}"; done

Thursday, March 31, 2016

Bash Dynamic Loops -- Read file daemon

#!/bin/bash 

COND1="break"
COND2="sleep 1"
 ## Dynamically change the loop logic from continue reading, to read 
 ## all data and break. 
[[ -z "${1}" ]] && COND="${COND1}" || COND="${COND2}" 
while IFS= read -d $'\n' -r a || ${COND}; do 
 [[ -n "$a" ]] && echo "curl -s http://foo.bar/some.php?id=${a}"
done < id_list.txt

exit 0 

Monday, March 28, 2016

Replacing Nth Occurrence from End of Line via Sed

SEARCH="one" 
SEARCHNEG=$(sed 's/./[^&]*/g' <<< "${SEARCH}")
OCCURRENCE=3 
REPLACE="FOUR" 
SED_DELIM=$'\001'  
sed -r "s${SED_DELIM}${SEARCH}((${SEARCHNEG}${SEARCH}){$((${OCCURRENCE}-1))}${SEARCHNEG})\$${SED_DELIM}${REPLACE}\1${SED_DELIM}"  <<< "one one two two one one three three one one"

Friday, February 26, 2016

Decoding Black Knight Satellite -- Recon

#!/usr/bin/env bash 

#############################################################################
###########################################################################
### Created by A.M.Danischewski (c) 2016 v1.00
### Issues: If you find any issues emai1 me at my <first name> dot 
###         <my last name> at gmail dot com.  
###
### This program is intended to facilitate the recording of the Live ISS 
### feed at http://www.ustream.tv/channel/live-iss-stream
### 
### I noticed that the downloaded files offered on the Ustream servers 
### seldom matched what I was viewing on the realtime stream from the 
### website. 
###
###  See the following for more background on the Black Knight Satellite: 
###    https://www.youtube.com/watch?v=3RmSKT-9u_A 
###    https://www.youtube.com/watch?v=eO6a_e2u0c4
### 
### To use this software, configure the download location variable below
### and add the aliases to your ~/.bashrc file. Then periodically open a 
### webbrowser to: http://www.ustream.tv/channel/live-iss-stream
###
### If you see anything interesting, type $> rbk and make sure the webbrowser
### window remains visible (it records exactly what you see on your desktop
### screen). When the anomolous/interesting activity is over, go back to 
### the recording terminal window and hit Ctrl-C to stop the recording. 
### Afterward you can view the recent recording by typing in $> vbk. 
###
### Upload your findings to Youtube as soon as possible. 
###  
### This program requires (to work to full capacity) by default: 
### bash, avconv/ffmpeg, vlc 
### 
### Other useful software, youtube-dl for downloading youtube videos: 
###   https://rg3.github.io/youtube-dl/
### 
### This program is free software: you can redistribute it and/or modify
### it under the terms of the GNU General Public License as published by
### the Free Software Foundation, either version 3 of the License, or
### (at your option) any later version.
###
### This program is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
### GNU General Public License for more details.
###
###########################################################################
#############################################################################

########  ### CHANGE ###  ### OUTPUT DIR ###  CHANGE THIS #### 
## Change the following to the location of a large drive where you 
## want the desktop recordings to live. 
##
 declare OUTPUTDIR="/mnt/seagate1/ISS/" ### CHANGE THIS 
##
#################### END CHANGE 

 ## These should be sensible for most people. 
declare FILE_PREFIX="ISS_$(date +%Y%m%d)"
declare RESOLUTION="1280x720" 
declare FRAMERATE="25" 
declare AVCONVPROG="$(which ffmpeg || which avconv)" 
declare DISCARD_DEV=/dev/random  ## If not on Linux, change to /dev/null
declare VIDEOCODEC="libx264" 
 ## If you are on Crouton or other chroot, change this (E.g. ":1.0+0,0")
declare CAPTUREDISPLAY=":0.0+0,0" 
declare OUTPUTSUFFIX="mkv" 

function get_max_iss_seq() {
 MAXSEQ=$( { ls -p "${OUTPUTDIR%/}/${FILE_PREFIX}"* | tr '.' '_' | grep -E "${FILE_PREFIX}_[0-9]*" | sort -n -t _ -k 3 | tail -1 | cut -d_ -f3; } 2>"${DISCARD_DEV}")
 echo "$((${MAXSEQ}+1))"
} 

function print_aliases() {  
cat << EOF
alias go2iss='cd "${OUTPUTDIR}"'  
alias rbk='${0} -r' 
alias arbk='${0} -ar' 
alias vbk='go2iss; vlc "\$(ls -tr ISS* | tail -1)"' 
EOF
} 

(($#==0)) && echo "Usage: ${0##*/} [-r (record)] [-ar (record with audio)] [-p (print aliases)]" && exit 0 
[[ ! -z "${1}" && "${1}" =~ ^-p ]]  && print_aliases && exit 0 
[[ ! -z "${1}" && "${1}" =~ ^-r ]]  && "${AVCONVPROG}" -f x11grab -r ${FRAMERATE} -s ${RESOLUTION} -i "${CAPTUREDISPLAY}" -vcodec ${VIDEOCODEC} -pre lossless_ultrafast -threads 0  "${OUTPUTDIR%/}/${FILE_PREFIX}_$(get_max_iss_seq).${OUTPUTSUFFIX}" && exit 0 
[[ ! -z "${1}" && "${1}" =~ ^-ar ]] && "${AVCONVPROG}" -preset medium -f alsa -i pulse -f x11grab -r ${FRAMERATE} -s ${RESOLUTION} -i "${CAPTUREDISPLAY}" -vcodec ${VIDEOCODEC} -threads 0 -aq 10 -af "volume=volume=10dB:precision=fixed" -ar 44100 -crf 23 "${OUTPUTDIR%/}/${FILE_PREFIX}_$(get_max_iss_seq).${OUTPUTSUFFIX}" && exit 0 

Monday, February 1, 2016

Print Greek in Bash

alias print_greek='declare -A na_array=(["0380"]=1  ["0381"]=1  ["0382"]=1  ["0383"]=1  ["038B"]=1  ["038D"]=1  ["0378"]=1  ["0379"]=1 ["037F"]=1 ["03A2"]=1 ); for uprefix in 037 038 039 03A 03B 03C 03D 03E 03F; do for usuffix in {0..9} {A..F}; do [[ -z $(echo "${na_array["${uprefix}${usuffix}"]+check}") ]] && printf "\u${uprefix}${usuffix}\n"; done; done;' 

Sunday, January 31, 2016

Simple Webscraper with PhantomJs!

////////////////////////////////////////////////////////// 
/////  PhantomJS URL Scraper v.1.3 ///// 
// 
// Copyrighted by +A.M.Danischewski  2016+ (c)
// This program may be reutilized without limits, provided this 
// notice remain intact. 
// 
// Usage: phantomjs phantom_urls.js <URL> [["class"|"id"] [<query id/class name>]]
//
//   Argument 1: URL -- "https://www.youtube.com/watch?v=8TniRMwL2Vg" 
//   Argument 2: "class" or "id" 
//   Argument 3: If Argument 2 was provided, "class name" or "id name" 
// 
// By default this program will display ALL urls from a user supplied URL.  
// If a class name or id name is provided then only URL's from the class 
// or id are displayed.  
//  
/////////////////////////////////// 

var page = require('webpage').create(), 
    system = require('system'),
    address;

if (system.args.length === 1) {
  console.log(' Usage: phantomjs phantom_urls.js <URL> [["class"|"id"] [<query id/class name>]]');
  phantom.exit();
}

address = system.args[1];
querytype= system.args[2];
queryclass = system.args[3];
page.open(address, function(status) {
  if (status !== 'success') {
    console.log('Error loading address: '+address);
  } else {
   //console.log('Success! In loading address: '+address);   
  }
});

page.onConsoleMessage = function(msg) {
  console.log(msg);
}

page.onLoadFinished = function(status) {
   var dynclass="function() { window.class_urls = new Array(); window.class_urls_next=0; var listings = document.getElementsByClassName('"+queryclass+"'); for (var i=0; i < listings.length; i++) { var el = listings[i]; var ellnks=[].map.call(el.querySelectorAll('a'),function(link) {return link.getAttribute('href');}); var elhtml=el.innerHTML; window.class_urls.push(ellnks.join('\\n')); }; return window.class_urls;}"; 
   var    dynid="function() { window.id_urls = new Array(); window.id_urls_next=0; var listings = document.getElementById('"+queryclass+"'); var ellnks=[].map.call(listings.querySelectorAll('a'),function(link) {return link.getAttribute('href');}); var elhtml=listings.innerHTML; window.id_urls.push(ellnks.join('\\n'));  return window.id_urls;}";  
   var  allurls="function() { var links = page.evaluate(function() { return [].map.call(document.querySelectorAll('a'), function(link) { return link.getAttribute('href'); };); };); console.log(links.join('\\n')); }"; 
   var page_eval_function="";  
   if (querytype === "class") {
   console.log(page.evaluate(dynclass).toString().replace(/,/g, "\n")); 
   } else if (querytype === "id") {
   console.log(page.evaluate(dynid).toString().replace(/,/g, "\n")); 
   } else { 
   var links = page.evaluate(function() {
        return [].map.call(document.querySelectorAll('a'), function(link) {
            return link.getAttribute('href');
        });
    });    
       console.log(links.join('\n'));
   }             
   phantom.exit();
};

Wednesday, January 20, 2016

cp to Multiple Destinations - cpm

alias cpm='_() { src="${1%/}"; shift; printf "\"%s\" " "$@" | xargs -n 1 cp -vR "${src}"; }; _' 

Wednesday, January 6, 2016

To the Clipboard! In Bash

#!/usr/bin/env bash

###     Copyrighted +A.M.Danischewski (c)2016+  
### You may reuse this software without limit provided 
###         this notice remain in tact. 
###
### File: clip.bsh
### Requires: xsel 
###  Description: This script copies something to the clipboard, I 
###  recommend a simple alias, such as: $> alias clip='clip.bsh' 
###  Then you can:    
###     $> echo "hi there" | clip 
###     $> clip myblogpost.html
###     $> clip <<< "little message" 
###  _-=  Enjoy!  _-=
  
declare cliptxt="${1}"
declare rdlnk=$(readlink /proc/$$/fd/0)
declare nl=$(echo -en "\x01") 
if grep -Eq "^pipe:|deleted" <<< "${rdlnk}"; then 
 [[ ! -z "${cliptxt}" ]] && cliptxt=""
 while IFS= read -d $'\n' -r piped_input || break; do cliptxt="${cliptxt}${piped_input}${nl}"; done  
elif [[ -f "${rdlnk}" ]]; then   ## Its a redirected file
 cliptxt=$(< "${rdlnk}") 
elif [[ -e "${cliptxt}" ]]; then ## Its a filename
 cliptxt=$(< "${cliptxt}")       ## File name proper no redirect
else 
 echo " *** Something is wrong, input not read by ${0}." 
fi 
echo -En "${cliptxt}" | tr "${nl}" "\n" | xsel -ib
exit 0